Python List comprehension:要列出的单个字符串

时间:2015-05-13 12:38:30

标签: python string

我在列表推导方面苦苦挣扎。

基本上我有一个简单的字符串:

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

请注意,括号,逗号和引号是字符串的一部分。 我需要的是一个list1,其中a,b,c,d为元素(因此我需要删除引号,逗号和括号。)

用于输入字符串:

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

这根本不起作用。 list1在没有开始"'"的情况下创建,但是当我尝试打印出list2时,引用又在那里。我甚至没有开始处理括号。 有没有一个很好的方法来获取我的清单?

6 个答案:

答案 0 :(得分: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 :(得分:2)

作为执行此类任务的更加pythonic方式,您可以使用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)

     

安全地评估表达式节点或包含Python文字或容器显示的Unicode或Latin-1编码字符串。提供的字符串或节点可能只包含以下Python文字结构:字符串,数字,元组,列表,dicts,布尔值和None。

您还可以使用在其他任务中更灵活且更有用的正则表达式:

注意在这种情况下使用literal_eval是pythonic方式!

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

答案 2 :(得分: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']

答案 3 :(得分: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']

答案 4 :(得分:0)

您可以使用replace()。尝试这个

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

答案 5 :(得分:0)

这是你想要的解决方案我不知道这个的复杂性,但这是一个简单的解决方案,你只需要在列表理解中添加一个条件。

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

输出为l= ['a', 'b', 'c', 'd']

注意:这仅适用于给定输入,如果输入更改,输出可能会有所不同。