0

我想将嵌套的字符串列表转换为单个列表。例如,如果有一个类似的列表,

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

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

4

6 回答 6

2

见下文(假设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']
于 2021-08-29T11:21:59.990 回答
2

如果您正在使用该more_itertools模块,请尝试以下collapse功能:

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

输出:

['apple', 'orange', 'pineapple', 'grapes']
于 2021-08-29T11:22:44.677 回答
2

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

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

很多其他答案都没有。

顺便说一下,这是一种深度优先搜索算法。

于 2021-08-29T11:27:50.857 回答
1

尝试:

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']
于 2021-08-29T11:22:08.823 回答
1

您正在寻找的是同一个包中的collapse方法。

这是一个示例用法:

import more_itertools

fruits = ['apple','orange', ['pineapple','grapes']]
print(list(more_itertools.collapse(fruits, base_type=str)))
# ['apple', 'orange', 'pineapple', 'grapes']
于 2021-08-29T11:24:39.377 回答
0

这里的每个人都已经给出了一些很好的答案,但最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']
于 2021-08-29T13:00:06.877 回答