搜索元组列表的一部分

3

我正在尝试根据另一个元组列表的部分匹配,对元组列表进行列表推导。

x = [((1,1),(1,1),(1,2)),
     ((2,1),(1,3),(2,9)),
     ((2,1),(2,3),(2,9))]
y = [(2,1),(1,3)]
[i for i in x for k in y if k in i]

例如,在这个例子中,x是元组列表,y是所需的元组列表。如果在x中的元组列表中找到了y,则应该返回该项。
结果是:[((2,1),(1,3),(2,9)),((2,1),(1,3),(2,9)),((2,1),(2,3),(2,9))] 但我只想要:[((2,1),(1,3),(2,9))] 我尝试过单个元组,它给出了期望的结果。但不确定为什么当我传递一个元组列表时它不起作用。
x = [((1,1),(1,1),(1,2)),
     ((2,1),(1,3),(2,9)),
     ((2,1),(2,3),(2,9))]
y = (2,1)
[i for i in x if y in i]

结果:[((2, 1), (1, 3), (2, 9)), ((2, 1), (2, 3), (2, 9))]

3个回答

3
如果不必使用理解(comprehension)的话:
[*filter({*y}.issubset, x)]

2

all 是关键,用于确定 y 中的所有元组是否都在 x 的每个元素中。

[
  tpl 
  for tpl in x 
  if all(tpl2 in tpl 
         for tpl2 in y)
]
# [((2, 1), (1, 3), (2, 9))]

或者设置成 y 相对于 x 来说足够大。 - SUTerliakov
@SUTerliakov - 你能否详细说明一下为什么或如何使用集合会有帮助?这是为了我的学习。 - Rajib Lochan Sarkar

1

您可以使用:

x = [
    ((1, 1), (1, 1), (1, 2)),
    ((2, 1), (1, 3), (2, 9)),
    ((2, 1), (2, 3), (2, 9)),
]
y = [(2, 1), (1, 3)]

print([t for t in x if not set(y).difference(t)])

输出:

[((2, 1), (1, 3), (2, 9))]

如果你使用集合操作从x中减去元组并将其用于y,如果所有子元组都存在,你最终会得到一个空集,因此你想要那个元组。
你也可以写成if set(y).issubset(t)而不是if not set(y).difference(t)部分。(来自@kellyBundy的答案)

如果我希望y的任何tpl为true但不是全部。

print([t for t in x if set(y).intersection(t)])

我喜欢所有三个答案,但我接受了你的答案,因为它对我来说更容易理解。如果我想让 y 的任何 tpl 为 true,而不是全部都为 true,我可以使用 Chris 的答案中的 any()。但我希望子集也能有任何参数来处理这个问题。 - Rajib Lochan Sarkar
2
你可以使用集合的交集。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接