我想把一个嵌套的字符串列表转换成一个列表。例如,如果有一个列表,如
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']