将列表列表(用逗号分隔的语句)展平为列表列表[重复]

Posted

技术标签:

【中文标题】将列表列表(用逗号分隔的语句)展平为列表列表[重复]【英文标题】:Flatten a list of lists (statements separated by a comma) into a list of lists [duplicate] 【发布时间】:2021-11-03 20:04:38 【问题描述】:

我有一份声明清单。每个语句都有许多其他语句,用逗号分隔。

gf = ['citrus fruit,black bread,margarine,ready soups', 'tropical 
fruit,yogurt,coffee, margarine', 'whole milk'] ## it has elements (lists with multiple items separated by EXTERNAL commas). 

我需要把它转换成:

gf_n = ['citrus fruit', 'black bread', 'margarine', 'ready soups', 'tropical fruit', 'yogurt', 'coffee', 'margarine','whole milk']

可以重复单个元素(单词或一组单词)。将来,我需要计算每个元素的频率(例如“柑橘类水果”)和每个两项组合的频率(例如“黑面包”和“人造黄油”)

这是我的代码,结果不是我需要的:

gf_list = list(gf.split(","))

gf_item = []

gf_item = [item for sublist in gf_list for item in sublist]

这是我得到的令人惊讶的结果(字母 - 不是文字)

['c', 'i', 't', 'r', 'u', 's', ' ', 'f', 'r', 'u'] # first 10 elements

我做错了什么?

解决方案(经过一段时间我想出了这个):

for subl in lst:

    gf_item.append(subl.split(","))

【问题讨论】:

请添加指定语言的标签。 解析并展平列表 (gf_n = sum((s.split(',') for s in gf), [])),如果前导和尾随空格应该保留,则需要修剪它们 ([s.strip() for s in gf_n])。 【参考方案1】:
 gf_item = [i.strip() for i in gf for i in i.split(',')]

使用生成器-

def flatten(x):
    if type(x) is str:
        for i in x.split(','):
            yield i.strip()
        return 
    try:
        for i in x:
            yield from flatten(i)
    except TypeError:
        yield x 

gf = ['citrus fruit,black bread,margarine,ready soups', 'tropical fruit,yogurt,coffee, margarine', 'whole milk']
gf_new = list(flatten(gf))

lst = [['alice', 'gun'], ['bob', 'tree', ' mot'],['cara']]
lst_new = list(flatten(lst))

print(gf_new)
print(lst_new)

输出:

['citrus fruit', 'black bread', 'margarine', 'ready soups', 'tropical fruit', 'yogurt', 'coffee', 'margarine', 'whole milk']
['alice', 'gun', 'bob', 'tree', 'mot', 'cara']

【讨论】:

这会产生不同的结果:['alice', 'gun', 'bob', 'tree', 'mot', 'cara']。我需要:[['alice', 'gun'], ['bob', 'tree', 'mot'], ['cara']]。我只是为了简洁而改变元素 你没有提到你的问题中可能有嵌套列表。请参阅您给出的示例包含一个平面字符串列表。 我已经编辑了答案。它现在可以工作了。【参考方案2】:

试试这个:

gf1 = str(gf).replace("[",'').replace("]",'').replace("'",'')
gf_n = [x.strip() for x in gf1.split(',')]

返回:

['citrus fruit',
 'black bread',
 'margarine',
 'ready soups',
 'tropical fruit',
 'yogurt',
 'coffee',
 'margarine',
 'whole milk']

【讨论】:

以上是关于将列表列表(用逗号分隔的语句)展平为列表列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

逗号分隔的字符串列表[重复]

检查逗号分隔列表是不是包含特定数字[重复]

安全地为查询准备逗号分隔列表[重复]

如何将元组列表展平为pythonic列表[重复]

用一个语句展平一棵树(列表列表)?

拆分由逗号分隔的 JSON blob 列表(忽略 JSON blob 中的逗号)[重复]