Làm cách nào để chuyển đổi một chuỗi với các mục được phân cách bằng dấu phẩy thành một danh sách trong Python?


140

Làm thế nào để bạn chuyển đổi một chuỗi thành một danh sách?

Nói chuỗi là như thế text = "a,b,c". Sau khi chuyển đổi, text == ['a', 'b', 'c']và hy vọng text[0] == 'a', text[1] == 'b'?


2
hi Tôi đã làm điều này như vậy, danh sách (stringObject.split ( ''))
Günay Gultekin

Câu trả lời:


205

Như thế này:

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

Ngoài ra, bạn có thể sử dụng eval()nếu bạn tin tưởng chuỗi an toàn:

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

@Clinteney: Không có vấn đề gì ;-) Bạn cũng có thể muốn xem xét picklenếu bạn đang duy trì các đối tượng cho chuỗi.
Cameron

2
Đây không phải là một mảng, nó là một danh sách, Mảng biểu thị các giá trị cơ bản và hoạt động rất giống các danh sách, ngoại trừ loại đối tượng được lưu trữ trong chúng bị ràng buộc.
joaquin

8
Nhắc nhở thân thiện: Không sử dụng eval, ngay cả khi bạn tin tưởng chuỗi an toàn. Nó không đáng để gây nguy hiểm bảo mật tiềm tàng cho bất cứ điều gì ngoài các tập lệnh cá nhân và nghịch ngợm trong một vỏ tương tác.
A. Wilson

3
eval ('[' + text + ']') sẽ coi a, b, c là biến, không phải chuỗi.
phaibin

1
Bị từ chối vì hai giải pháp được đề xuất làm những việc hoàn toàn khác nhau và điều này không được giải thích theo bất kỳ cách nào trong văn bản trả lời. Mặc dù bản thân câu hỏi không thực sự rõ ràng, nhưng cần phải làm rõ trong câu trả lời rằng hai giải pháp không phải là giải pháp thay thế tương đương, nhưng khác nhau về cách hiểu của câu hỏi.
Matteo Italia

179

Chỉ để thêm vào các câu trả lời hiện có: hy vọng, bạn sẽ gặp một cái gì đó giống như thế này trong tương lai:

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

Nhưng những gì bạn đang giải quyết ngay bây giờ , hãy đi với câu trả lời của @ Cameron .

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

4
Mặc dù tôi đồng ý với bạn rằng câu trả lời của @ Cameron là câu trả lời "ngay bây giờ" nhưng tôi nghĩ rằng sự thấu đáo của bạn làm cho câu trả lời này đúng hơn. Chúng tôi hiếm khi được cung cấp các chuỗi được phân tách bằng dấu phẩy trong thế giới thực và thật tốt khi biết cách chuyển đổi sang danh sách bất kể định dạng.
TristanZimmerman

39

Mã Python sau đây sẽ biến chuỗi của bạn thành một danh sách các chuỗi:

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

3
Họ cũng có thể sử dụng jsonví dụ:json.loads(teststr)
Mohammad Nazari

24

Tôi không nghĩ bạn cần phải

Trong python, bạn hiếm khi cần chuyển đổi một chuỗi thành một danh sách, bởi vì các chuỗi và danh sách rất giống nhau

Thay đổi loại

Nếu bạn thực sự có một chuỗi nên là một mảng ký tự, hãy làm điều này:

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

Không thay đổi loại

Lưu ý rằng Chuỗi rất giống danh sách trong python

Chuỗi có bộ truy cập, như danh sách

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

Chuỗi có thể lặp lại, như danh sách

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

TLD

Chuỗi là danh sách. Hầu hết.


8

Trong trường hợp bạn muốn phân chia theo dấu cách, bạn chỉ có thể sử dụng .split():

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

Đầu ra:

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

Điều này xuất ra những gì ở giữa (), tức là không có gì cả.
Anthon

7

Nếu bạn thực sự muốn mảng:

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

Nếu bạn không cần mảng và chỉ muốn tìm chỉ mục cho các ký tự của mình, hãy nhớ một chuỗi là một lần lặp, giống như một danh sách ngoại trừ thực tế là nó không thay đổi:

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

1
Vì tò mò, sau khi bạn thực hiện myarray = mảng ('c', văn bản), "c" đã đi đâu? vì nếu bạn gõ mảng, bạn có mảng ("c", "abc"), nhưng a [0] == a? Cảm ơn bạn
Clinteney Hui

@Clinteney: 'c' có nghĩa là "tạo ra một mảng các ký tự". Xem tài liệu để biết thêm thông tin
Cameron

Tôi đã nâng cấp, nhưng quá sớm. Tôi nhận được mảng ('c', '1 1 91 0,001 228') khi gọi a = mảng ('c', e) trong đó e = "1 1 91 0,001 228"
Valentin Heinitz

@ValentinHeinitz Vâng, đó là những gì bạn phải nhận được như trong ví dụ của tôi. Bạn mong chờ điều gì ?
joaquin

1
@joaquin: Ok, tôi hiểu rồi. Không sao với câu trả lời. Tôi đã bối rối bởi câu hỏi "text == [a, b, c]" nên là "text == ['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]]

Vui lòng cung cấp một số thông tin bổ sung cùng với mã của bạn để người đăng ban đầu có thể hiểu rõ hơn cách giải quyết vấn đề của anh ấy.
Ivan

4

Tất cả các câu trả lời là tốt, có một cách làm khác, đó là hiểu danh sách, xem giải pháp dưới đây.

u = "UUUDDD"

lst = [x for x in u]

đối với danh sách được phân tách bằng dấu phẩy, hãy làm như sau

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

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

Tôi không hiểu dòng đơn cho các vòng lặp và sẽ không bao giờ
Mr PizzaGuy

1
@MrPizzaGuy thật dễ dàng và rất tiện dụng khi bạn sử dụng nó, hãy kiểm tra youtube.com/watch?v=AhSvKGTh28Q
waghydjemy

1

Tôi thường sử dụng:

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

các stripkhông gian xung quanh remove từ.


1

Để chuyển đổi một stringbiểu mẫu a="[[1, 3], [2, -6]]"tôi đã viết chưa được tối ưu hóa mã:

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'

Bạn nên sử dụng translatephương thức tích hợp cho chuỗi.

Nhập help('abc'.translate)vào Python shell để biết thêm.



0

ví dụ 1

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

Ví dụ 2

>>> email= "myemailid@gmail.com, someonsemailid@gmail.com"
>>> email.split(',')
#OUTPUT
["myemailid@gmail.com", "someonsemailid@gmail.com"]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.