繁体   English   中英

从列表列表中按特定关键字提取列表

[英]Extract lists by specific keywords from a list of lists

我只需要从列表中提取包含特殊关键字的列表:

my_list= [['sussidi', '14,5'],
 ['sussidi', '42,5', 'miliardi'],
 ['esclusioni.', "l'anno", 'scorso,', '41'],
 ['esclusioni.', "l'anno", 'scorso,', '22', 'milioni'],
 ['scorso,', '41', 'milioni', 'visitatori'],
 ['40', 'milioni', 'visitatori'],
 ['paese', 'aspettava', '40'],
 ['aspettava', '40', 'milioni']]

我只想提取那些包含以下关键字的列表:

keywords = ['visitatori','sussidi']

我做了:

for item in my_list:
    print([x for x in item if any(kw in x for kw in keywords)])

但它只给了我关键字:

['sussidi']
['sussidi']
[]
[]
['visitatori']
['visitatori']
[]
[]

我预期的 output 将是

['sussidi', '14,5']
['sussidi', '42,5', 'miliardi']
[]
[]
['scorso,', '41', 'milioni', 'visitatori']
['40', 'milioni', 'visitatori']
[]
[]

任何帮助表示赞赏。

您有太多级别的循环( x for x in item... )。 做就是了:

for item in my_list:
     print(item if any(kw in item for kw in keywords) else [])

你可以做

l=[y  if x  else [] for x , y in zip( pd.DataFrame(my_list).isin(keywords).any(1),my_list)]
[['sussidi', '14,5'], ['sussidi', '42,5', 'miliardi'], [], [], ['scorso,', '41', 'milioni', 'visitatori'], ['40', 'milioni', 'visitatori'], [], []]

这可以作为 1 行列表理解来完成:

print([item for item in my_list if any([kw in item for kw in keywords])])

如果任何关键字在该列表中,这将打印由my_list中的项目(子列表)组成的列表。

my_list=[lists if len(set(lists) & set(keywords))>0 else [] for lists in my_list ]

在列表理解中使用 if-else 搜索关键字和内部列表之间的交集。 如果找到任何元素,则取内部列表,否则返回 []

您可以使用此列表理解:

ll = [l for s in kw for l in my_list if s in l]

-------------------------------------------------- -------------------------------------------------- ----

该列表推导等效于这个嵌套的 for 循环:

for l in my_list:
    for s in kw:
        if s in l:
            print(l)

Output:

['sussidi', '14,5']
['sussidi', '42,5', 'miliardi']
['scorso,', '41', 'milioni', 'visitatori']
['40', 'milioni', 'visitatori']

其实很简单:

    # Create a set of the keywords to check if a given
    # word in one of the inners list is a keyword 
    keywords_set = set(keywords)

    # create list in which you are going to store the
    # inner lists that satisfy your condition
    final_result = []
    
    for inner_list in my_list:
        for word in inner_list:
            if word in keywords_set:
                final_result.append(inner_list)
    
    print(final_result)

控制台 Output:

    [
        ['sussidi', '14,5'], 
        ['sussidi', '42,5', 'miliardi'], 
        ['scorso,', '41', 'milioni', 'visitatori'], 
        ['40', 'milioni', 'visitatori']
    ]

使用过滤器 function 和 lambda 函数,可以使用函数式编程而不是列表理解来编写两级 for 循环:

    final_result = filter(lambda inner_list: any(map(lambda word: word in keywords_set, inner_list)), my_list)

不过,最有效的方法是使用集合结构的交集(& 符号)操作:

    final_result = filter(lambda inner_list: len(keywords_set & set(inner_list)) > 0, my_list)

重要的部分是: len(keywords_set & set(inner_list)) > 0我们正在检查这两个集合的交集是否为空集合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM