2017-07-15 47 views
2

我有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]

+0

举例来说,你应该用字母 – PRMoureu

回答

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) 
+0

来代替整数键或者更简洁:'print([k for k,v in my_dict.items()if v&x == x])' – janos

+3

或者干脆用' x.issubset(my_dict [I])'。无需创建中间设置。 –

+0

是的,你可以做列表理解,但最好给出OP想要的形式的答案。 –

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

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) 
0

要检查组的全部是另一组中,这样的最好的(在我的opinon)是使用<>算子,这些算子在数学中相当于“是超集”,相当于set.issuperset方法。这种方式的优点是,>=<=运营商自然可用来检查非严格超集。

这里是做的相当的idomatic方式:

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]),如果是这种情况,那么我们只是将索引追加到期望的列表中。