Skip to main content
 首页 » 编程设计

python之扁平化字符串列表

2025年05月04日20daizhj

我有这个列表:

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() 你不应该使用是安全的,因为它只计算没有副作用的文字。