python - 使用列表列表过滤列表列表
问题描述
我有两个列表列表,一个包含所有记录,例如[['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk'], ['cereal', 'skittles']]
一个包含规则[['milk', 'eggs'], ['milk','ham']]
。
[['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk']]
我正在尝试通过 list_of_rules 过滤记录,但是,尽管它不完全匹配[['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']]
非常感谢任何和所有建议。
解决方案
您可以使用此列表理解:
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
)中。
推荐阅读
- c# - 当 ComboBox ItemsSource 位于 DataGridTemplateColumn 中时,如何在运行时更新它?
- java - FTPSClient 发送二进制文件:“SSLHandshakeException:握手期间远程主机关闭连接”
- delphi - 如何在 Delphi 2007 应用程序中获取已注册接口及其 GUID 的列表?
- doctrine-orm - Doctrine 2 反向 DQL 成员
- eclipse - Eclipse 启动配置为带有图标的单独工具栏按钮
- javascript - Babel 插件 - 使用索引的成员访问
- javascript - 承诺返回 null
- lua - lua 中的 C# 中的“goto”循环是否有等价物?(必须兼容Love2D)
- build - QBS:qbs.buildVariant 和 qbs.configurationName 有什么区别?
- php - codeigniter 保存任何事务