如何将嵌套的字符串列表转换为一个列表?
How to convert a nested list of strings to a one list?
我想将嵌套的字符串列表转换为单个列表。
例如,
如果有这样的列表,
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
有解决办法吗?
提前致谢。
见下文(假设 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']
尝试:
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']
如果您使用的是 more_itertools
模块,请尝试 collapse
函数:
print(list(more_itertools.collapse(fruits)))
输出:
['apple', 'orange', 'pineapple', 'grapes']
您正在寻找的是来自同一包的 collapse 方法。
这是一个用法示例:
import more_itertools
fruits = ['apple','orange', ['pineapple','grapes']]
print(list(more_itertools.collapse(fruits, base_type=str)))
# ['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"
]
]]
很多其他答案都没有。
顺便说一句,这是一个深度优先搜索算法。
这里的每个人都已经给出了一些很好的答案,但最 pythonic 的方法是使用正则表达式。
我们可以删除方括号或只提取字母
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']
我想将嵌套的字符串列表转换为单个列表。 例如, 如果有这样的列表,
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
有解决办法吗? 提前致谢。
见下文(假设 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']
尝试:
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']
如果您使用的是 more_itertools
模块,请尝试 collapse
函数:
print(list(more_itertools.collapse(fruits)))
输出:
['apple', 'orange', 'pineapple', 'grapes']
您正在寻找的是来自同一包的 collapse 方法。
这是一个用法示例:
import more_itertools
fruits = ['apple','orange', ['pineapple','grapes']]
print(list(more_itertools.collapse(fruits, base_type=str)))
# ['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"
]
]]
很多其他答案都没有。
顺便说一句,这是一个深度优先搜索算法。
这里的每个人都已经给出了一些很好的答案,但最 pythonic 的方法是使用正则表达式。 我们可以删除方括号或只提取字母
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']