Antworten:
Verwenden Sie die join
Methode der leeren Zeichenfolge, um alle Zeichenfolgen zusammen mit der leeren Zeichenfolge dazwischen zu verbinden:
>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'
' '.join(list)
mit einem Leerzeichen zwischen den Anführungszeichen
"".join(['a','b','c'])
bedeutet Join all elements of the array, separated by the string ""
. In gleicher Weise " hi ".join(["jim", "bob", "joe"])
wird erstellt "jim hi bob hi joe"
.
Dies funktioniert in vielen gängigen Sprachen wie JavaScript und Ruby. Warum nicht in Python?
>>> ['a', 'b', 'c'].join('')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'
Seltsamerweise befindet sich die join
Methode in Python in der str
Klasse:
# this is the Python way
"".join(['a','b','c','d'])
Warum join
ist eine Methode im list
Objekt nicht wie in JavaScript oder anderen gängigen Skriptsprachen? Dies ist ein Beispiel dafür, wie die Python-Community denkt. Da join eine Zeichenfolge zurückgibt, sollte diese in der Zeichenfolgenklasse und nicht in der Listenklasse platziert werden. Die str.join(list)
Methode bedeutet also: Verknüpfen Sie die Liste mit einer neuen Zeichenfolge str
als Trennzeichen (in diesem Fall str
handelt es sich um eine leere Zeichenfolge).
Irgendwie habe ich diese Art zu denken nach einer Weile geliebt. Ich kann mich über viele Dinge im Python-Design beschweren, aber nicht über dessen Kohärenz.
string.join()
mit den meisten Sammlungen verglichen , die eine join()
Methode in vielen dynamischen Sprachen haben. In Bezug auf iterables ist es für solche Sprachen wahrscheinlich kein Problem, da es genauso einfach (und lesbar) ist, das iterable in einen Sammlungskonstruktor und eine Kette in die join()
Methode einzuschließen .
Wenn Ihr Python-Interpreter alt ist (z. B. 1.5.2, wie es bei einigen älteren Linux-Distributionen üblich ist), steht Ihnen möglicherweise kein join()
altes Zeichenfolgenobjekt als Methode zur Verfügung, und Sie müssen stattdessen das Zeichenfolgenmodul verwenden. Beispiel:
a = ['a', 'b', 'c', 'd']
try:
b = ''.join(a)
except AttributeError:
import string
b = string.join(a, '')
Die Zeichenfolge b
wird sein 'abcd'
.
Dies kann der schnellste Weg sein:
>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'
''.join(['a','b','c'])
map(ord,a)
nicht erforderlich ist, aber Join-Anforderungen map(chr,a)
. Hier ist meine Benchmark pastebin.com/1sKFm8ma
''.join()
viel besser lesbar.
Die Reduktionsfunktion funktioniert auch
import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'
(reduce + '' h)
oder (apply + h)
würde funktionieren. Andererseits benötigt der Add-Operator in Python genau zwei Operanden, weshalb eine Reduzierung erforderlich ist. Andernfalls könnten Sie dies tun operator.add(*h)
, da apply
dies in Python offiziell zugunsten der erweiterten Aufrufsyntax (auch bekannt als en.wikipedia.org/wiki/Variadic_function ) veraltet ist
Wenn die Liste Zahlen enthält, können Sie map()
mit verwenden join()
.
Z.B:
>>> arr = [3, 30, 34, 5, 9]
>>> ''.join(map(str, arr))
3303459
''.join([str(i) for i in arr])
h = ['a','b','c','d','e','f']
g = ''
for f in h:
g = g + f
>>> g
'abcdef'
''.join(h)
würde Ihre Einzelanhängungsmethode bei weitem übertreffen.
Außerdem str.join
besteht die natürlichste Möglichkeit darin, alle Elemente auf einmal zu verwenden io.StringIO
und zu missbrauchen writelines
:
import io
a = ['a','b','c','d']
out = io.StringIO()
out.writelines(a)
print(out.getvalue())
Drucke:
abcd
Wenn Sie diesen Ansatz mit einer Generatorfunktion oder einer Iterable verwenden, die keine tuple
oder keine ist list
, wird die temporäre Listenerstellung gespeichert, join
mit der die richtige Größe auf einmal zugewiesen wird (und eine Liste mit 1-Zeichen-Zeichenfolgen ist speichermäßig sehr teuer ).
Wenn Sie wenig Speicher haben und ein träge ausgewertetes Objekt als Eingabe haben, ist dieser Ansatz die beste Lösung.
Sie könnten auch so verwenden operator.concat()
:
>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'
Wenn Sie Python 3 verwenden, müssen Sie Folgendes voranstellen:
>>> from functools import reduce
da das eingebaute reduce()
aus Python 3 entfernt wurde und nun in lebt functools.reduce()
.