Virgülle ayrılmış öğeler içeren bir dizeyi Python'daki bir listeye nasıl dönüştürebilirim?


140

Bir dizeyi listeye nasıl dönüştürürsünüz?

Dize diyelim text = "a,b,c". Dönüşüm, sonra text == ['a', 'b', 'c']umarım ve text[0] == 'a', text[1] == 'b'?


2
merhaba bunu böyle yaptım, list (stringObject.split (','))
Günay Gültekin

Yanıtlar:


205

Bunun gibi:

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

Alternatif olarak, eval()dizenin güvenli olduğuna güveniyorsanız şunları kullanabilirsiniz :

>>> text = 'a,b,c'
>>> text = eval('[' + text + ']')

@Clinteney: Sorun değil ;-) pickleNesneleri dizelere devam ediyorsanız da bakmak isteyebilirsiniz .
Cameron

2
Bu bir dizi değildir, bir listedir, Diziler temel değerleri temsil eder ve bunlarda saklanan nesnelerin türü kısıtlanmış olmadıkça listelere çok benzer davranırlar.
joaquin

8
Kolay hatırlatma: Dizeyi güvenli olduğuna güveniyor olsanız bile eval kullanmayın. Kişisel senaryolardan ve etkileşimli bir kabukta uğraşmaktan başka bir şey için potansiyel güvenlik tehlikesine değmez.
A. Wilson

3
eval ('[' + text + ']') a, b, c değişkenini dize olarak değil, değişken olarak ele alır.
phaibin

1
Önerilen iki çözüm tamamen farklı şeyler yaptığı ve cevap metninde hiçbir şekilde açıklanmadığı için indirildi. Sorunun kendisi tam olarak açık olmasa da, cevapta iki çözümün eşdeğer alternatifler değil, sorunun farklı yorumları olduğu açıkça belirtilmelidir.
Matteo Italia

179

Sadece mevcut cevaplara eklemek için: umarım gelecekte böyle bir şeyle karşılaşırsınız:

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

Ama şu anda uğraştığınız şey , @ Cameron'un cevabına gidin.

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

4
Her ne kadar @ Cameron'un cevabının "şu anda" yanıtı olduğunu kabul etsem de, titizliğinizin bunu daha doğru bir cevap haline getirdiğini düşünüyorum. Gerçek dünyada nadiren virgülle ayrılmış dizeler verilir ve formattan bağımsız olarak bir listeye nasıl dönüştürüleceğini bilmek iyidir.
TristanZimmerman

39

Aşağıdaki Python kodu dizenizi bir dize listesine dönüştürür:

import ast
teststr = "['aaa','bbb','ccc']"
testarray = ast.literal_eval(teststr)

3
Örneğin şunları da kullanabilirler json:json.loads(teststr)
Mohammad Nazari

24

Ben değil mi ihtiyaç için

Python'da, bir dizeyi bir listeye dönüştürmeniz gerekir, çünkü dizeler ve listeler çok benzerdir

Türü değiştirme

Gerçekten bir karakter dizisi olması gereken bir dizeniz varsa, bunu yapın:

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

Türü değiştirmeme

Dizelerin python'daki listelere çok benzediğini unutmayın

Dizelerde listeler gibi erişimciler bulunur

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

Dizeler, listeler gibi yinelenebilir

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

TLDR

Dizeler listelerdir. Neredeyse.


8

Boşluklara bölmek istiyorsanız, şunları kullanabilirsiniz .split():

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

Çıktı:

['mary', 'had', 'a', 'little', 'lamb'] 

Bu, arasında ()hiçbir şey olmadığı anlamına gelir.
Anthon

7

Aslında diziler istiyorsanız:

>>> 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'

Dizilere ihtiyacınız yoksa ve yalnızca karakterlerinize göre dizine bakmak istiyorsanız, bir dizenin tekrarlanabilir olduğunu unutmayın, tıpkı değişmez olması haricinde bir liste gibi:

>>> text = "a,b,c"
>>> text = text.replace(',', '')
>>> text[0]
'a'

1
Mucizenin dışında myarray = array ('c', metin) yaptıktan sonra "c" nereye gitti? çünkü dizi yazarsanız dizi ("c", "abc"), ancak bir [0] == a? Teşekkür ederim
Clinteney Hui

@Clinteney: 'c', "bir karakter dizisi oluştur" anlamına gelir. Daha fazla bilgi için dokümanlara bakın
Cameron

Oy verdim, ama çok erken. A = dizi ('c', e) çağırırken dizi ('c', '1 1 91 0.001 228') elde ediyorum ; burada e = "1 1 91 0.001 228"
Valentin Heinitz

@ValentinHeinitz Evet, örneğimde gösterildiği gibi almanız gereken budur. Ne bekliyorsunuz ?
joaquin

1
@joaquin: Tamam, anladım. Cevapta sorun yok. "Text == [a, b, c]" sorusunun "text == ['a', 'b', 'c']" olması gerektiği konusunda kafam karıştı
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]]

Orijinal posterin bunun sorununu nasıl çözdüğünü daha iyi anlayabilmesi için lütfen kodunuzla birlikte bazı ek bilgiler sağlayın.
Ivan

4

Tüm cevaplar iyidir, liste kavraması olan başka bir yol var, aşağıdaki çözüme bakın.

u = "UUUDDD"

lst = [x for x in u]

virgülle ayrılmış liste için aşağıdakileri yapın

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

lst = [x for x in u.split(',')]

Ben döngüler için tek satır anlamak ve asla irade
Mr PizzaGuy

1
@MrPizzaGuylayın, kullandığınızda kolay ve çok kullanışlı, bu youtube.com/watch?v=AhSvKGTh28Q
waghydjemy

1

Genellikle kullanıyorum:

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

stripkelime etrafında kaldırma alanlarda.


1

Yazmak için bir stringform dönüştürmek için a="[[1, 3], [2, -6]]"henüz optimize değil kodu:

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

0
# to strip `,` and `.` from a string ->

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

translateDizeler için yerleşik yöntemi kullanmalısınız .

Tip help('abc'.translate)fazla bilgi için Python kabuğunda.


0

Fonksiyonel Python kullanma:

text=filter(lambda x:x!=',',map(str,text))

0

örnek 1

>>> email= "myemailid@gmail.com"
>>> email.split()
#OUTPUT
["myemailid@gmail.com"]

ÖRNEK 2

>>> email= "myemailid@gmail.com, someonsemailid@gmail.com"
>>> email.split(',')
#OUTPUT
["myemailid@gmail.com", "someonsemailid@gmail.com"]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.