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?

Goran
quelle

Antworten:

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

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

DiebMaster
quelle
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.

John Machin
quelle
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'
Greg Brown
quelle
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