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

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']