2017-07-15 56 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]),如果是這種情況,那麼我們只是將索引追加到期望的列表中。