如何将一个嵌套的字符串列表转换为一个列表?



我想把一个嵌套的字符串列表转换成一个列表。例如,如果有一个列表,如

fruits = ['apple','orange, ['pineapple','grapes']]

我想把它转换成:

fruits = ['apple','orange','pineapple','grapes']

我尝试使用more_itertools.chain.from_iterable(fruits),但我得到的输出是:

['a','p','p','l','e','o','r','a','n','g','e','pineapple','grapes']

即使尝试[inner for item in fruits for inner in item],这也会给出与上面相同的输出。

我也尝试了[inner for item in fruits for inner in ast.literal_eval(item)],但这是一个错误ValueError: malformed string

有解决方法吗?提前谢谢。

如果您正在使用more_itertools模块,请尝试collapse函数:

print(list(more_itertools.collapse(fruits)))

输出:

['apple', 'orange', 'pineapple', 'grapes']

见下文(假设fruits只包含字符串或列表)

fruits = ['apple', 'orange', ['pineapple', 'grapes']]
flat = []
for f in fruits:
if isinstance(f, str):
flat.append(f)
else:
flat.extend(f)
print(flat)

输出
['apple', 'orange', 'pineapple', 'grapes']

您可以使用任意优雅的方法和库,但老实说,递归的经典用例:

def to_list_of_strings(thing):
if type(thing) is str:
return [thing]
# it's not just a string, so take apart
retlist = []
for element in thing:
retlist += to_list_of_strings(element)
return retlist

请注意,这适用于任意深度嵌套的列表,如

[[ 
"a",
[ 
"more",
[ 
"than"
],
"just",
[
[
"a",
"single",
[
"layer"
]
],
"deep"
],
"list"
]
]]

很多其他答案都没有。

这是一个深度优先搜索算法。

尝试:

fruits = ["apple", "orange", ["pineapple", "grapes"]]
fruits = [l for v in fruits for l in (v if isinstance(v, list) else [v])]
print(fruits)

打印:

['apple', 'orange', 'pineapple', 'grapes']

您要查找的是来自同一包的折叠方法。

下面是一个用法示例:

import more_itertools
fruits = ['apple','orange', ['pineapple','grapes']]
print(list(more_itertools.collapse(fruits, base_type=str)))
# ['apple', 'orange', 'pineapple', 'grapes']

这里的每个人都已经给出了一些很好的答案,但最python的方法是使用正则表达式。我们可以删除方括号或只提取字母

import re
fruits = ['apple','orange', ['pineapple','grapes'],['Mango',"Guava","banana"],'Fruits']
fruits = str(fruits)
pattern1 = "[A-Za-z]+"
res1 = re.findall(pattern1,fruits)
print(res1)
Python 3.9.4输出:
['apple', 'orange', 'pineapple', 'grapes', 'Mango', 'Guava', 'banana', 'Fruits']

最新更新