我在列表推导方面苦苦挣扎。
基本上我有一个简单的字符串:
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时,引用又在那里。我甚至没有开始处理括号。
有没有一个很好的方法来获取我的清单?
答案 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)
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']
注意:这仅适用于给定输入,如果输入更改,输出可能会有所不同。