Odpowiedzi:
Użyj join
metody 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 str
klasie:
# 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 str
jako separatora (w tym przypadku str
jest 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 b
bę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ż apply
został 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.join
co jest najbardziej naturalnym sposobem, istnieje możliwość użycia io.StringIO
i nadużywania writelines
do 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 tuple
lub 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()
.