集合交集

3
我有一个键为集合的字典 my_dict,还有一个集合 x
我需要返回一个包含所有与 x 中数字相同的元素的集合列表。如果 my_dict 中的集合不包含 x 中的所有数字,则不应将其返回。
我想使用交集操作符(&),但它会返回 my_dict 中的所有集合。
my_dict = {1: {1,2,3,4,5},

       2: {1,2,3,7,8},

       3: {1,2,3,4}

       }

x = {1,2,5}
new_list = []


for i in my_dict:
   if my_dict[i] & x:
        new_list.append(i)
print(new_list)

输出:

[1, 2, 3]

我需要接收 [1] 而不是 [1, 2, 3]


对于示例示例,您应该用字母替换整数键。 - PRMoureu
5个回答

2

当交集变成x时,这意味着字典中的集合中包含x中的所有值。

for i in my_dict:
     if (my_dict[i] & x)==x:
         new_list.append(i)
print(new_list)

编辑:如下方评论所建议,您也可以执行以下操作

for i in my_dict:
     if x.issubset(my_dict[i]):
         new_list.append(i)
print(new_list)

更简洁地说:print([k for k, v in my_dict.items() if v & x == x]) - janos
3
可以直接使用 x.issubset(my_dict[i]),无需创建中间集合。 - Ashwini Chaudhary
是的,你可以使用列表推导式,但最好以原帖作者想要的形式作出答复。 - Rajan Chauhan

1

我建议您使用set.issuperset方法,而不是使用&运算符。当存在一种方法可以完全实现您想要的功能时,为什么要组合多个运算符呢?

new_list = []
for i in my_dict:
    if my_dict[i].issuperset(x):
        new_list.append(i)

请注意,通常我会使用列表推导式来编写此代码:

newlist = [key for key, value in my_dict.items() if value.issuperset(x)]

1
我的字典值和x之间的交集应该等于x,这意味着x应该是我的字典值的子集。
my_dict = {1: {1,2,3,4,5},
           2: {1,2,3,7,8},
           3: {1,2,3,4}}

x = {1,2,5}

new_list = []

for i,j in my_dict.items():
   if x.issubset(j):
        new_list.append(i)

print(new_list)

0

要检查一个集合是否完全包含在另一个集合中,最好的方法(在我看来)是使用 <> 运算符,这些运算符被重载为数学中“是超集”的等价物,并等同于 set.issuperset 方法。这种方式的优点是 >=<= 运算符自然可用于检查非严格超集。

以下是一种相当惯用的方法:

new_list = []
for key, value in my_dict.items():
    if value >= x:
        new_list.append(key)

你原始代码的问题在于它检查两个集合之间是否存在任何交集,即它们共享至少一个元素,而你似乎想要检查所有x: set是否都在你正在检查的集合中。
如果你想简化代码,我建议使用列表推导式,除非你还需要执行其他步骤。
new_list = [key for key, value in my_dict.items() if value >= x]

0
这个问题也可以使用 issubset 函数来解决。以下是一个示例:
for i in my_dict:
     if x.issubset(my_dict[i]):
            new_list.append(i)

输出:[1] 在这个示例中,我们正在检查字典中每个键值对的值是否是x的超集(换句话说,x属于my_dict[i]),如果是这种情况,我们只需将索引追加到所需的列表中。

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