2017-07-15 1 views
2

J'ai my_dict avec des ensembles comme valeurs et j'ai x qui est également un ensemble.Intersection dans les ensembles

Je dois retourner la liste avec l'ensemble de mon dict qui contient tous les nombres dans x. Si défini dans my_dict ne contient pas tous les numéros dans x Je ne veux pas le renvoyer.

Je veux utiliser l'intersection (&) mais il renvoie tous les ensembles dans 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) 

Sortie:

[1, 2, 3] 

Je dois recevoir [1] au lieu de [1, 2, 3]

+0

Pour l'exemple d'exemple, vous devez remplacer la clé entière par des lettres – PRMoureu

Répondre

2

Lorsque l'intersection devient x cela signifie que toutes les valeurs de x sont présentes dans l'ensemble dans le dictionnaire.

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

Edit: comme suggéré dans les commentaires ci-dessous, vous pouvez également faire

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

Ou plus compactement: 'print ([k pour k, v dans my_dict.items() si v & x == x])' – janos

+3

Ou simplement utiliser ' x.issubset (my_dict [i]) '. Pas besoin de créer un ensemble intermédiaire. –

+0

Oui, vous pouvez faire la compréhension de la liste, mais il est préférable de donner une réponse sous la forme que OP voulait. –

1

Je vous suggère d'utiliser la méthode set.issuperset, plutôt que d'utiliser l'opérateur &. Pourquoi combiner plusieurs opérateurs quand une méthode existe pour faire exactement ce que vous voulez?

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

Notez que je normalement écrire ceci avec une compréhension de la liste:

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

La section inter entre les valeurs de my_dict et x doit être égale à x qui signifie x doit être un sous-ensemble de la valeur 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

pour vérifier si la totalité d'un ensemble est dans une autre série, la plus belle (dans mon opinon) est d'utiliser la < et > opérateurs, qui sont prioritaires pour agir comme l'équivalent de "est un surensemble de" en mathématiques, et équivalent à la méthode set.issuperset. L'avantage de cette façon est que les opérateurs >= et <= sont naturellement disponibles pour vérifier les supersets non stricts.

est ici tout à fait un moyen idiomatiques de le faire:

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

Le problème avec votre code d'origine est-il vérifie s'il y a une intersection entre les deux ensembles, à savoir qu'ils partagent même un seul élément, lorsque vous semblez vouloir vérifier si tout le x: set est dans l'ensemble que vous vérifiez.

Je vous conseille également d'utiliser une liste de compatibilité si vous voulez simplifier le code, sauf si vous avez d'autres étapes à suivre.

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

Ceci peut également être résolu en utilisant la fonction issubset.Voici un exemple:

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

Sortie: [1]

Dans cet exemple, nous vérifions si la valeur de chaque valeur paire de clés dans le dictionnaire est un super jeu de x (en d'autres termes x appartient à my_dict[i]), si tel est le cas, nous ajoutons simplement l'index à la liste désirée.