Verknüpfen mehrerer Zeichenfolgen, wenn diese in Python nicht leer sind


77

Ich habe vier Saiten und jede davon kann leer sein. Ich muss sie zu einer Zeichenfolge mit Leerzeichen dazwischen verbinden. Wenn ich benutze:

new_string = string1 + ' ' + string2 + ' ' + string3 + ' ' + string4

Das Ergebnis ist ein Leerzeichen am Anfang der neuen Zeichenfolge, wenn diese string1leer ist. Außerdem habe ich drei Leerzeichen, wenn string2und string3sind leer.

Wie kann ich sie ohne Leerzeichen verbinden, wenn ich sie nicht benötige?

Antworten:


195
>>> strings = ['foo','','bar','moo']
>>> ' '.join(filter(None, strings))
'foo bar moo'

Durch die Verwendung Noneim filter()Aufruf werden alle falschen Elemente entfernt.


2
Wie kann diese Lösung angewendet werden, wenn sie auf eine Spalte eines Datenrahmens angewendet wird? Wenn du es versuchst df.apply(", ".join(filter(None, ...)), axis=1). Wie übergibt man das zweite Argument der Filterfunktion?
Michael

22

Wenn Sie wissen, dass die Zeichenfolgen keine führenden / nachfolgenden Leerzeichen haben:

>>> strings = ['foo','','bar','moo']
>>> ' '.join(x for x in strings if x)
'foo bar moo'

Andernfalls:

>>> strings = ['foo ','',' bar', ' ', 'moo']
>>> ' '.join(x.strip() for x in strings if x.strip())
'foo bar moo'

und wenn eine der Zeichenfolgen nicht führende / nachfolgende Leerzeichen enthält, müssen Sie möglicherweise noch härter arbeiten. Bitte klären Sie, was Sie tatsächlich haben.


Zeichenfolgen stammen aus den Eingabetextfeldern, sodass alles möglich ist. Vielen Dank!
Goran

-2
strings = ['foo','','bar','moo']
' '.join([x for x in strings if x is not ''])
'foo bar moo'

4
Besser verwenden !=statt is not. Es könnte funktionieren, ist aber nicht garantiert. Oder einfach benutzen [x for x in strings if x].
Tim Pietzcker

7
Nie verwenden is notfür nicht-Singletons , wenn Sie tatsächlich nicht überprüfen möchten , wenn beide die gleichen Objekte sind!
ThiefMaster
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.