Odpowiedzi:
Użyj joinmetody pustego ciągu, aby połączyć wszystkie ciągi razem z pustym ciągiem pomiędzy nimi, tak jak poniżej:
>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'
' '.join(list)spację między cytatami
"".join(['a','b','c'])oznacza Join all elements of the array, separated by the string "". W ten sam sposób " hi ".join(["jim", "bob", "joe"])stworzy "jim hi bob hi joe".
Działa to w wielu popularnych językach, takich jak JavaScript i Ruby, dlaczego nie w Pythonie?
>>> ['a', 'b', 'c'].join('')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'
Dziwne, w Pythonie join metoda jest na strklasie:
# this is the Python way
"".join(['a','b','c','d'])
Dlaczego join nie ma metody wlist obiekcie jak w JavaScript lub innych popularnych językach skryptowych? Jest to jeden przykład tego, jak myśli społeczność Python. Ponieważ funkcja złączenia zwraca łańcuch, powinna zostać umieszczona w klasie łańcucha, a nie w klasie listy, więc str.join(list)metoda oznacza: połącz listę w nowy ciąg, używając strjako separatora (w tym przypadku strjest to ciąg pusty).
Po jakimś czasie pokochałem ten sposób myślenia. Mogę narzekać na wiele rzeczy w projekcie Pythona, ale nie na jego spójność.
string.join()z większością kolekcji posiadających join()metodę w wielu dynamicznych językach. Jeśli chodzi o iterable, wydaje mi się, że nie jest to problemem dla takich języków, ponieważ tak łatwe (i czytelne) jest zamknięcie iterowalnego konstruktora kolekcji i łańcucha w join()metodzie.
Jeśli twój interpreter Pythona jest stary (na przykład 1.5.2, który jest powszechny w niektórych starszych dystrybucjach Linuksa), możesz nie mieć join()dostępnej metody dla dowolnego starego obiektu łańcucha, a zamiast tego będziesz musiał użyć modułu łańcucha. Przykład:
a = ['a', 'b', 'c', 'd']
try:
b = ''.join(a)
except AttributeError:
import string
b = string.join(a, '')
Ciąg bbędzie 'abcd'.
To może być najszybszy sposób:
>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'
''.join(['a','b','c'])
map(ord,a)jest to niepotrzebne, ale dołączenie wymaga map(chr,a). Oto mój test pastebin.com/1sKFm8ma
''.join()jest o wiele bardziej czytelny.
Działa również funkcja redukcji
import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'
(reduce + '' h)lub (apply + h)działałoby. Ale z drugiej strony, w Pythonie operator dodania przyjmuje dokładnie 2 operandy, stąd potrzeba redukcji. W przeciwnym razie możesz to zrobić operator.add(*h), ponieważ applyzostał on oficjalnie uznany za przestarzały w Pythonie na rzecz rozszerzonej składni wywołania (alias en.wikipedia.org/wiki/Variadic_function )
Jeśli lista zawiera liczby, możesz używać map()zjoin() .
Na przykład:
>>> 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)znacznie przewyższy metodę dodawania jeden po drugim.
poza tym, str.joinco jest najbardziej naturalnym sposobem, istnieje możliwość użycia io.StringIOi nadużywania writelinesdo pisania wszystkich elementów za jednym razem:
import io
a = ['a','b','c','d']
out = io.StringIO()
out.writelines(a)
print(out.getvalue())
drukuje:
abcd
Kiedy używasz tego podejścia z funkcją generatora lub iterowalną, która nie jest a tuplelub a list, zapisuje to tworzenie tymczasowej listyjoin która umożliwia przydzielenie odpowiedniego rozmiaru za jednym razem (a lista łańcuchów 1-znakowych jest bardzo droga pod względem pamięci ).
Jeśli masz mało pamięci i masz leniwie oceniany obiekt jako dane wejściowe, takie podejście jest najlepszym rozwiązaniem.
Możesz również użyć operator.concat()tego w następujący sposób:
>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'
Jeśli używasz Python 3, musisz przygotować:
>>> from functools import reduce
odkąd wbudowane reduce()zostało usunięte z Python 3 i teraz mieszka w functools.reduce().