Jak przekonwertować ciąg z elementami rozdzielanymi przecinkami na listę w Pythonie?

140

Jak przekształcić ciąg znaków w listę?

Powiedz, że struna jest jak text = "a,b,c". Po konwersji, text == ['a', 'b', 'c']i miejmy nadzieję text[0] == 'a', text[1] == 'b'?

Clinteney Hui
źródło
2
cześć Zrobiłem to w ten sposób, list (stringObject.split (','))
Günay Gültekin,

Odpowiedzi:

205

Lubię to:

>>> text = 'a,b,c'
>>> text = text.split(',')
>>> text
[ 'a', 'b', 'c' ]

Alternatywnie możesz użyć, eval()jeśli ufasz, że ciąg jest bezpieczny:

>>> text = 'a,b,c'
>>> text = eval('[' + text + ']')
Cameron
źródło
@Clinteney: Żaden problem ;-) Możesz także sprawdzić, pickleczy utrwalasz obiekty w łańcuchach.
Cameron,
2
To nie jest tablica, to jest lista. Tablice reprezentują podstawowe wartości i zachowują się bardzo podobnie do list, z wyjątkiem tego, że typ obiektów w nich przechowywanych jest ograniczony.
joaquin
8
Przyjazne przypomnienie: nie używaj eval, nawet jeśli ufasz, że string jest bezpieczny. Nie jest warte potencjalnego zagrożenia bezpieczeństwa dla czegokolwiek innego niż osobiste skrypty i majstrowanie w interaktywnej powłoce.
A. Wilson,
3
eval ('[' + tekst + ']') potraktuje a, b, c jako zmienne, a nie łańcuch.
phaibin
1
Negocjowane, ponieważ te dwa proponowane rozwiązania robią zupełnie inne rzeczy, a nie jest to w żaden sposób wyjaśnione w tekście odpowiedzi. Chociaż samo pytanie nie jest do końca jasne, w odpowiedzi należy wyjaśnić, że te dwa rozwiązania nie są równoważnymi alternatywami, ale różnymi interpretacjami pytania.
Matteo Italia
179

Aby dodać do istniejących odpowiedzi: miejmy nadzieję, że w przyszłości napotkasz coś podobnego:

>>> word = 'abc'
>>> L = list(word)
>>> L
['a', 'b', 'c']
>>> ''.join(L)
'abc'

Ale to, co masz do czynienia teraz , iść z @ Cameron odpowiedzi „s.

>>> word = 'a,b,c'
>>> L = word.split(',')
>>> L
['a', 'b', 'c']
>>> ','.join(L)
'a,b,c'
Droogans
źródło
4
Chociaż zgadzam się z tobą, że odpowiedź @ Camerona była odpowiedzią "teraz", myślę, że twoja dokładność sprawia, że ​​jest to bardziej poprawna odpowiedź. W prawdziwym świecie rzadko otrzymujemy ciągi znaków oddzielone przecinkami i dobrze jest wiedzieć, jak przekonwertować na listę, niezależnie od formatu.
TristanZimmerman
39

Poniższy kod w Pythonie zamieni Twój ciąg w listę ciągów:

import ast
teststr = "['aaa','bbb','ccc']"
testarray = ast.literal_eval(teststr)
Bryan
źródło
3
Mogą też użyć jsonna przykład:json.loads(teststr)
Mohammad Nazari
24

Myślę, że nie potrzebujesz się

W Pythonie rzadko trzeba konwertować ciąg znaków na listę, ponieważ łańcuchy i listy są bardzo podobne

Zmiana typu

Jeśli naprawdę masz ciąg, który powinien być tablicą znaków, zrób to:

In [1]: x = "foobar"
In [2]: list(x)
Out[2]: ['f', 'o', 'o', 'b', 'a', 'r']

Nie zmienia typu

Zauważ, że ciągi znaków są bardzo podobne do list w pythonie

Łańcuchy mają akcesory, takie jak listy

In [3]: x[0]
Out[3]: 'f'

Łańcuchy są iterowalne, podobnie jak listy

In [4]: for i in range(len(x)):
...:     print x[i]
...:     
f
o
o
b
a
r

TLDR

Ciągi znaków to listy. Prawie.

firelynx
źródło
8

Jeśli chcesz podzielić spacjami, możesz po prostu użyć .split():

a = 'mary had a little lamb'
z = a.split()
print z

Wynik:

['mary', 'had', 'a', 'little', 'lamb'] 
vivek mishra
źródło
To daje to, co jest pomiędzy (), tj. W ogóle nic.
Anthon
7

Jeśli faktycznie chcesz tablice:

>>> from array import array
>>> text = "a,b,c"
>>> text = text.replace(',', '')
>>> myarray = array('c', text)
>>> myarray
array('c', 'abc')
>>> myarray[0]
'a'
>>> myarray[1]
'b'

Jeśli nie potrzebujesz tablic i chcesz tylko przeglądać swoje znaki według indeksu, pamiętaj, że ciąg jest iterowalny, podobnie jak lista, z wyjątkiem faktu, że jest niezmienny:

>>> text = "a,b,c"
>>> text = text.replace(',', '')
>>> text[0]
'a'
joaquin
źródło
1
Z ciekawości, po wykonaniu myarray = array ('c', text), gdzie się podziało "c"? ponieważ jeśli wpiszesz tablicę, otrzymasz tablicę ("c", "abc"), ale [0] == a? Dziękuję
Clinteney Hui
@Clinteney: „c” oznacza „utwórz tablicę znaków”. Zobacz dokumentację, aby uzyskać więcej informacji
Cameron
Głosowałem za, ale za wcześnie. Otrzymuję tablicę ('c', '1 1 91 0,001 228') podczas wywoływania a = array ('c', e), gdzie e = "1 1 91 0,001 228"
Valentin Heinitz
@ValentinHeinitz Tak, to właśnie musisz uzyskać, jak pokazano w moim przykładzie. Czego oczekujesz ?
joaquin
1
@joaquin: Ok, rozumiem. Odpowiedź jest w porządku. Zmyliło mnie pytanie „tekst == [a, b, c]” powinno być „tekst == ['a', 'b', 'c']”
Valentin Heinitz
4
m = '[[1,2,3],[4,5,6],[7,8,9]]'

m= eval(m.split()[0])

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Josué
źródło
Podaj dodatkowe informacje wraz z kodem, aby oryginalny plakat mógł lepiej zrozumieć, jak to rozwiązuje jego problem.
Ivan
4

Wszystkie odpowiedzi są dobre, jest inny sposób, którym jest zrozumienie listy, zobacz rozwiązanie poniżej.

u = "UUUDDD"

lst = [x for x in u]

w przypadku listy oddzielonej przecinkami wykonaj następujące czynności

u = "U,U,U,D,D,D"

lst = [x for x in u.split(',')]
Zeus
źródło
Nie rozumiem pojedynczej linii dla pętli i nigdy nie zrozumiem
Mr PizzaGuy
1
@MrPizzaGuy jest to łatwe i bardzo poręczne podczas korzystania, sprawdź to youtube.com/watch?v=AhSvKGTh28Q
waghydjemy
1

Zwykle używam:

l = [ word.strip() for word in text.split(',') ]

te stripprzestrzenie usuń wokół słów.

Yannick Loiseau
źródło
1

Aby przekonwertować stringposiadający formularz, a="[[1, 3], [2, -6]]"który napisałem jeszcze nie zoptymalizowany kod:

matrixAr = []
mystring = "[[1, 3], [2, -4], [19, -15]]"
b=mystring.replace("[[","").replace("]]","") # to remove head [[ and tail ]]
for line in b.split('], ['):
    row =list(map(int,line.split(','))) #map = to convert the number from string (some has also space ) to integer
    matrixAr.append(row)
print matrixAr
Khalid
źródło
0
# to strip `,` and `.` from a string ->

>>> 'a,b,c.'.translate(None, ',.')
'abc'

W translateprzypadku ciągów znaków należy użyć wbudowanej metody.

Wpisz help('abc'.translate)w powłoce Pythona, aby uzyskać więcej informacji.

N 1.1
źródło
0

Korzystanie z funkcjonalnego Pythona:

text=filter(lambda x:x!=',',map(str,text))
Eratostenes
źródło