集合中的交集

时间:2017-07-15 11:31:41

标签: python for-loop intersection

我将my_dict设置为值,而x也是一组。

我需要从我的dict中返回带有set的列表,其中包含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]

5 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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)]

答案 2 :(得分:1)

my_dict值和x之间的内部区域应该等于x,这意味着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,j in my_dict.items():
   if x.issubset(j):
        new_list.append(i)

print(new_list)

答案 3 :(得分: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]

答案 4 :(得分:0)

这也可以使用issubset函数来解决。这是一个例子:

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

输出:[1]

在这个例子中,我们检查字典中每个键值对的值是否是x的超集(换句话说x属于my_dict[i]),如果是这样,那么我们只需将索引附加到所需列表。