【问题标题】:Using a list of lists to filter a list of lists使用列表列表过滤列表列表
【发布时间】:2019-04-03 20:55:39
【问题描述】:

我有两个列表列表,一个包含所有记录,例如[['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk'], ['cereal', 'skittles']] 和一个包含规则的[['milk', 'eggs'], ['milk','ham']]

我正在尝试按 list_of_rules 过滤记录,但是,我想捕获 [['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk']],尽管它与 [['milk', 'eggs'], ['milk','ham']] 订单和额外项目不完全匹配。

records = [['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk'], ['cereal', 'skittles']]

list_of_rules = [['milk', 'eggs'], ['milk','ham']]

# this list comprehension only filters for exact matches

results = [[x for x in L if x in records] for L in list_of_rules] 


# expected output

print(results)
>>[['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk']]

非常感谢任何和所有建议。

【问题讨论】:

    标签: python python-3.x list list-comprehension


    【解决方案1】:

    您可以使用此列表推导:

    records = [['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk'], ['cereal', 'skittles']]
    
    list_of_rules = [['milk', 'eggs'], ['milk','ham']]
    
    results = [L for L in records if any(set(R).issubset(L) for R in list_of_rules)]
    
    print(results) # => [['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk']]
    

    它对每个记录列表L进行循环并检查是否存在至少一个规则列表R(使用内置函数any)使得R包含在L中(使用 set 方法issubset)。

    【讨论】:

      【解决方案2】:

      您可以使用listsets 规则并要求任何带有内部列表的intersection'ed 规则与set 相同(即所有 项在set 也存在于内部列表中):

      records = [['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk'], ['cereal', 'skittles']]
      
      list_of_rules = [{'milk', 'eggs'}, {'milk','ham'}]
      
      # this list comprehension only filters for exact matches
      
      # take the full inner list if all things in any rule are in this inner list
      results = [ x for x in records if any( p.intersection(x) == p for p in list_of_rules)  
      print(results)
      

      输出:

      [['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk']]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-29
        • 2017-06-29
        • 2022-11-29
        • 1970-01-01
        • 2014-04-28
        • 2014-08-14
        • 1970-01-01
        • 2019-01-09
        相关资源
        最近更新 更多