我有这个列表:
list1 = ["['word']", "['second', 'first']", "['first']"]
您可以看到它不完全是字符串列表的列表,因为项目已转换为字符串。
我想要这个扁平化的输出:
list2 = ['word', 'second', 'first', 'first']
只是一个简单的字符串列表。
我试过用这种方式:
list2 = [ x.strip('[]') for x in list1]
但问题在于第二项仍被视为一项:
["'word'", "'second', 'first'", "'first'"]
所以我尝试用逗号分隔:
list3 = [item.split(',') for x in list2 for item in x]
但它给出了这个输出:
[["'"],
['w'],
['o'],
['r'],
['d'],
["'"],
["'"],
['s'],
['e'],
['c'],
['o'],
['n'],
['d'],
["'"],
['', ''],
[' '],
["'"],
['f'],
['i'],
['r'],
['s'],
['t'],
["'"],
["'"],
['f'],
['i'],
['r'],
['s'],
['t'],
["'"]]
知道如何解决这个问题吗?
更新 - 解决方案
在@AKX 的帮助下
list2 = [ast.literal_eval(item) for item in list1]
然后使用这个函数:
def flatten(lst):
for el in lst:
if isinstance(el, list):
yield from el
else:
yield el
list3 = flatten(list2)
list(list3)
这给出:
['word', 'second', 'first', 'first']
更新 2
来自@waynelpu 的优化和替代解决方案,而不是flatten 函数,只需使用:
list2 = [inner for item in list1 for inner in ast.literal_eval(item)]
请您参考如下方法:
如果你有一个表示列表的 Python 表达式字符串列表(嵌套子句如何),你将不得不使用 ast.literal_eval()回到现实。
>>> import ast
>>> list1 = ["['word']", "['second', 'first']", "['first']"]
>>> list2 = [ast.literal_eval(item) for item in list1]
[['word'], ['second', 'first'], ['first']]
使用 ast.literal_eval() ,而不是危险 eval() 你不应该使用是安全的,因为它只计算没有副作用的文字。
