2017-06-26 2 views
0

J'ai la difficulté suivante: Étant donné mon dictionnaire d'entrée avec 4 clés et leurs valeurs par ex. Je souhaite obtenir tous les sous-dictionnaires possibles avec une seule valeur pour chaque clé; de préférence dans une liste par ex.Étant donné un dictionnaire, obtenir toutes les configurations de sous-dictionnaire possibles

dict_list = [ 
    {'WetGrass': False, 'Rain': False, 'Sprinkler': False, 'Cloudy': False}, 
    {'WetGrass': False, 'Rain': False, 'Sprinkler': False, 'Cloudy': True}, 
    {'WetGrass': False, 'Rain': False, 'Sprinkler': True, 'Cloudy': False}, 
    {'WetGrass': False, 'Rain': False, 'Sprinkler': True, 'Cloudy': True}, 
    {'WetGrass': True, 'Rain': False, 'Sprinkler': False, 'Cloudy': False}, 
    {'WetGrass': True, 'Rain': False, 'Sprinkler': False, 'Cloudy': True}, 
    {'WetGrass': True, 'Rain': False, 'Sprinkler': True, 'Cloudy': False}, 
    {'WetGrass': True, 'Rain': False, 'Sprinkler': True, 'Cloudy': True} 
] 

J'ai essayé déjà les éléments suivants:

src = {'lblA': (False, True), 'lblB': (False, True), 'lblC': (0, 1, 2)} 
labels, terms = zip(*src.items()) 
print [dict(zip(labels, term)) for term in itertools.product(*terms)] 

D'ici:

Best way to enumerate a cartesian product with labels in python?

Mais je continue à obtenir l'erreur:

TypeError 'bool' object is not iterable

J'espère que quelqu'un peut m'aider.

Merci!

Répondre

2

problème initial est ici que toutes vos valeurs sont tuples sauf 'Rain' (dont la valeur est bool et ce n'est pas itérable), donc je l'ai fait tuple ainsi:

global_dict = {'Cloudy': (False, True), 
       'Rain': (False,), 
       'Sprinkler': (False, True), 
       'WetGrass': (False, True)} 

(False,) est simple tuple -élément.

Enfin, nous pouvons créer dict_list en utilisant itertools.product comme

from itertools import product 

global_dict = {'Cloudy': (False, True), 
       'Rain': (False,), 
       'Sprinkler': (False, True), 
       'WetGrass': (False, True)} 

possible_values = product(*global_dict.values()) 
dict_list = [dict(zip(global_dict.keys(), values)) 
      for values in possible_values] 

nous donne

>>>dict_list 
[{'Cloudy': False, 'Rain': False, 'Sprinkler': False, 'WetGrass': False}, 
{'Cloudy': False, 'Rain': False, 'Sprinkler': False, 'WetGrass': True}, 
{'Cloudy': False, 'Rain': False, 'Sprinkler': True, 'WetGrass': False}, 
{'Cloudy': False, 'Rain': False, 'Sprinkler': True, 'WetGrass': True}, 
{'Cloudy': True, 'Rain': False, 'Sprinkler': False, 'WetGrass': False}, 
{'Cloudy': True, 'Rain': False, 'Sprinkler': False, 'WetGrass': True}, 
{'Cloudy': True, 'Rain': False, 'Sprinkler': True, 'WetGrass': False}, 
{'Cloudy': True, 'Rain': False, 'Sprinkler': True, 'WetGrass': True}] 

test

desired_dict_list = [ 
    {'WetGrass': False, 'Rain': False, 'Sprinkler': False, 'Cloudy': False}, 
    {'WetGrass': False, 'Rain': False, 'Sprinkler': False, 'Cloudy': True}, 
    {'WetGrass': False, 'Rain': False, 'Sprinkler': True, 'Cloudy': False}, 
    {'WetGrass': False, 'Rain': False, 'Sprinkler': True, 'Cloudy': True}, 
    {'WetGrass': True, 'Rain': False, 'Sprinkler': False, 'Cloudy': False}, 
    {'WetGrass': True, 'Rain': False, 'Sprinkler': False, 'Cloudy': True}, 
    {'WetGrass': True, 'Rain': False, 'Sprinkler': True, 'Cloudy': False}, 
    {'WetGrass': True, 'Rain': False, 'Sprinkler': True, 'Cloudy': True} 
] 

assert (len(dict_list) == len(desired_dict_list) and 
     all(dictionary in dict_list 
      for dictionary in desired_dict_list)) 
+0

Hey Azat merci beaucoup! C'était exactement ce que je voulais accomplir! Pouvez-vous m'expliquer pourquoi j'ai eu l'erreur ci-dessus? Et que fait le * devant global_dict.values ​​()? Quel est son effet? – SolingerMUC

+0

@SolingerMUC: ok, donnez-moi une minute –

+0

@SolingerMUC: fait –