2015-05-13 2 views
0

Я борюсь со списком.Python List comprehension: Single string to list

В принципе у меня есть простая строка:

string = "['a','b','c','d']" 

Примечание, что скобки, запятые и кавычки являются частью строки. Что мне нужно, это list1 с, Ь, с, d в качестве элементов (так что мне нужно, чтобы избавиться от кавычек, запятых и скобки.)

для записи в строке:

list1 = [x.lstrip(" ' ") for x in string.split(',')] 
list2 = [x.strip(" ' ") for x in list1] 

Это не работает вообще. list1 создается без начала "'", но когда я пытаюсь распечатать список2, цитаты там снова. Я даже не начал разбираться с скобками. Есть ли хороший способ получить мой список?

+0

Я предпочитаю использовать 'ast.literal_eval', но на основе ваших усилий он будет выглядеть так:' data = [value.strip ("'") для значения в строке [1: -1] .split ('')] '. – Matthias

ответ

2

В качестве более вещий способ для таких задач, которые вы можете использовать ast.literal_eval:

>>> s= "['a','b','c','d']" 
>>> from ast import literal_eval 
>>> list1=literal_eval(s) 
>>> list1 
['a', 'b', 'c', 'd'] 

ast.literal_eval (node_or_string)

Безопасная оценка узла выражения или кодировки Unicode или Latin-1, содержащей литеральный или контейнерный дисплей Python. Представленная строка или узел могут состоять только из следующих литеральных структур Python: строк, чисел, кортежей, списков, dicts, booleans и None.

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

Примечание что в этом случае с помощью literal_eval это вещий путь!

>>> import re 
>>> re.findall(r'\w+',s) 
['a', 'b', 'c', 'd'] 
+1

Именно это я и искал. Большое спасибо :) – Rima

2

Если строка уже построен как объект списка, но в кавычках, как вы заявили:

string = "['a','b','c','d']" 

Вы можете просто сделать

exec('list1='+string) 

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

string = "a,b,c,d" 

Например

import re 
string = re.sub(r"[^\w,]", "", string) 

А затем использовать

>>> list1 = string.split(',') 
>>> list1 
['a','b','c','d'] 
1

ast.literal_eval - это путь. Он не будет выполнять вредоносный код, если пользователь изменяет строку, чтобы выполнить какой-то эксплойт. Проверьте Using python's eval() vs. ast.literal_eval()? за дополнительной информацией.

import ast 
string = "['a','b','c','d']" 
assert ast.literal_eval(string) == ['a','b','c','d'] 
0

Использование ast.literal_eval

In [110]: from ast import literal_eval 

In [111]: li=literal_eval(string) 

In [112]: li 
Out[112]: ['a', 'b', 'c', 'd'] 

In [113]: type(li) 
Out[113]: list 

или в качестве альтернативы, используя Строгание со списком понимания

In [122]: li1=string[1:-1].split(',') 
Out[122]: ["'a'", "'b'", "'c'", "'d'"] 
In [127]: [elem.strip("'") for elem in li1] 
Out[127]: ['a', 'b', 'c', 'd'] 

или

In [7]: li2=list(string) 

In [8]: [elem for elem in li2 if elem.isalpha()] 
Out[8]: ['a', 'b', 'c', 'd'] 
0

Вы можете использовать вместо(). попробуйте эту

>>> string = "['a','b','c','d']" 
>>> string.replace("'", "") 
'[a,b,c,d]' 
>>> print string.replace("", "") 
['a','b','c','d'] 
>>> print string.replace("'", "") 
[a,b,c,d] 
0

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

string = "['a','b','c','d']" 
l = [x for x in string if x not in ['"',"[","]","'",',']] 

выход будет l= ['a', 'b', 'c', 'd']

Примечание: Это только для данного входа, выход может изменяться, если вход изменен.