Как преобразовать строку с разделенными запятыми элементами в список в Python?


140

Как вы конвертируете строку в список?

Скажи, что строка похожа text = "a,b,c". После преобразования, text == ['a', 'b', 'c']и , надеюсь text[0] == 'a', text[1] == 'b'?


2
Привет, я сделал это так, список (stringObject.split (','))
Günay Gültekin

Ответы:


205

Как это:

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

Кроме того, вы можете использовать, eval()если вы доверяете строке, чтобы быть в безопасности:

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

@Clinteney: Нет проблем ;-) Вы также можете посмотреть pickle, сохраняете ли вы объекты в строки.
Кэмерон

2
Это не массив, это список, массивы представляют базовые значения и ведут себя очень похоже на списки, за исключением того, что тип хранящихся в них объектов ограничен.
Хоакин

8
Дружеское напоминание: не используйте eval, даже если вы уверены, что строка безопасна. Это не стоит потенциальной угрозы безопасности для чего-то большего, чем личные сценарии и игра в интерактивной оболочке.
А. Уилсон

3
eval ('[' + text + ']') будет рассматривать a, b, c как переменные, а не строку.
Файбин

1
Понижено, потому что два предложенных решения делают совершенно разные вещи, и это никак не объясняется в тексте ответа. Хотя сам вопрос не совсем ясен, в ответе должно быть ясно, что оба решения - не эквивалентные альтернативы, а различные интерпретации вопроса.
Matteo Italia

179

Просто добавлю к существующим ответам: надеюсь, в будущем вы столкнетесь с чем-то еще:

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

Но то , что вы имеете дело с прямо сейчас , пойти с @ Cameron ответ «s.

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

4
Хотя я согласен с вами, что ответ @ Cameron был ответом «прямо сейчас», я думаю, что ваша тщательность делает этот ответ более правильным. В реальном мире нам редко даются строки, разделенные запятыми, и полезно знать, как преобразовать их в список независимо от формата.
TristanZimmerman

39

Следующий код Python превратит вашу строку в список строк:

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

3
Они также могут использовать, jsonнапример:json.loads(teststr)
Мухаммед Назари

24

Я не думаю , что вам нужно , чтобы

В Python редко требуется преобразовать строку в список, потому что строки и списки очень похожи

Изменение типа

Если у вас действительно есть строка, которая должна быть массивом символов, сделайте это:

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

Не меняя тип

Обратите внимание, что строки очень похожи на списки в Python

Строки имеют методы доступа, например списки

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

Строки являются итеративными, как списки

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

TLDR

Строки являются списками. Почти.


8

Если вы хотите разделить пробелы, вы можете просто использовать .split():

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

Вывод:

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

Это выводит то, что находится между (), то есть вообще ничего.
Anthon

7

Если вы действительно хотите массивы:

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

Если вам не нужны массивы, а вы хотите просматривать только символы по индексу, помните, что строка является итеративной, как список, за исключением того факта, что она неизменна:

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

1
Из любопытства, после того, как вы сделали myarray = array ('c', text), куда делась буква "c"? так как если вы введете массив, вы получите массив ("c", "abc"), но a [0] == a? Спасибо
Clinteney Хуэй

@Clinteney: «c» означает «создать массив символов». См. Документы для получения дополнительной информации
Камерон

Я проголосовал, но слишком рано. Я получаю массив ('c', '1 1 91 0,001 228') при вызове a = array ('c', e) где e = "1 1 91 0,001 228"
Валентин Хайниц

@ValentinHeinitz Да, это то, что вы должны получить, как показано в моем примере. Что вы ожидаете ?
Хоакин

1
@joaquin: Хорошо, я понял. Все в порядке с ответом. Меня смутил вопрос: «text == [a, b, c]» должно быть «text == ['a', 'b', 'c']"
Валентин Хайниц

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

Пожалуйста, предоставьте некоторую дополнительную информацию вместе с вашим кодом, чтобы оригинальный автор мог лучше понять, как это решает его проблему.
Иван

4

Все ответы хороши, есть другой способ, который заключается в понимании списка, см. Решение ниже.

u = "UUUDDD"

lst = [x for x in u]

для списка через запятую сделайте следующее

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

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

Я не понимаю ни одной строки для циклов и никогда не
пойму

1
@MrPizzaGuy это легко и очень удобно, когда вы используете его, проверьте это youtube.com/watch?v=AhSvKGTh28Q
waghydjemy


1

Чтобы преобразовать stringимеющую форму a="[[1, 3], [2, -6]]"я написал еще не оптимизированный код:

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'

Вы должны использовать встроенный translateметод для строк.

Введите help('abc'.translate)в оболочке Python для получения дополнительной информации.



0

Пример 1

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

Пример 2

>>> email= "myemailid@gmail.com, someonsemailid@gmail.com"
>>> email.split(',')
#OUTPUT
["myemailid@gmail.com", "someonsemailid@gmail.com"]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.