Home > Blockchain >  Reverse dictionary mapping incorrectly
Reverse dictionary mapping incorrectly

Time:01-09

I have a ingredient_dict dictionary I'm trying to apply in reverse to the Ingredients column wherever values in the column appear as values in the key-value pairs.

ingredient_dict = {
                    'Aardappelen': ('Dunne frieten', 'Half kruimige aardappelen', 'Voorgekookte halve kriel met schil',
                                    'Kruimige aardappelen', 'Roodschillige aardappelen', 'Opperdoezer Ronde aardappelen'),
                    'Kipgehakt': ('Gemengd gekruid gehakt', 'Kipgehakt met Mexicaanse kruiden', 'Half-om-halfgehakt met Italiaanse kruiden',
                                  'Kipgehakt met tuinkruiden'),
                    'Ui': ("Rode ui"),
                    'Kipfilet': ('Kipfilet met tuinkruiden en knoflook'),
                    'Kipworst': ('Gekruide kipworst'),
                    'Kipshoarma': ('Kalkoenshoarma')
                    }

reverse_label_ing = {x:k for k,v in ingredient_dict.items() for x in v}
# df_check["Ingredients"].replace(reverse_label_ing, inplace=True)

When I show the reverse_label_ing result I see "Aardappelen" for example was reversed correctly but I get issues with Rode ui and Gekruide kipworst and Kalkoenshoarma and I'm not sure why. Anyone know why the individual characters of "Rode ui" for instance are showing up as individual keys?:

reverse_label_ing

{'Dunne frieten': 'Aardappelen',
 'Half kruimige aardappelen': 'Aardappelen',
 'Voorgekookte halve kriel met schil': 'Aardappelen',
 'Kruimige aardappelen': 'Aardappelen',
 'Roodschillige aardappelen': 'Aardappelen',
 'Opperdoezer Ronde aardappelen': 'Aardappelen',
 'Gemengd gekruid gehakt': 'Kipgehakt',
 'Kipgehakt met Mexicaanse kruiden': 'Kipgehakt',
 'Half-om-halfgehakt met Italiaanse kruiden': 'Kipgehakt',
 'Kipgehakt met tuinkruiden': 'Kipgehakt',
 'R': 'Ui',
 'o': 'Kipshoarma',
 'd': 'Kipworst',
 'e': 'Kipshoarma',
 ' ': 'Kipworst',
 'u': 'Kipworst',
 'i': 'Kipworst',
 'K': 'Kipshoarma',
 'p': 'Kipworst',
 'f': 'Kipfilet',
 'l': 'Kipshoarma',
 't': 'Kipworst',
 'm': 'Kipshoarma',
 'n': 'Kipshoarma',
 'k': 'Kipshoarma',
 'r': 'Kipshoarma',
 'G': 'Kipworst',
 'w': 'Kipworst',
 's': 'Kipshoarma',
 'a': 'Kipshoarma',
 'h': 'Kipshoarma'}

CodePudding user response:

If you mean for each value in ingredient_dict to be a tuple, you need to add a trailing comma inside the parens:

ingredient_dict = {
                    'Aardappelen': ('Dunne frieten', 'Half kruimige aardappelen', 'Voorgekookte halve kriel met schil',
                                    'Kruimige aardappelen', 'Roodschillige aardappelen', 'Opperdoezer Ronde aardappelen'),
                    'Kipgehakt': ('Gemengd gekruid gehakt', 'Kipgehakt met Mexicaanse kruiden', 'Half-om-halfgehakt met Italiaanse kruiden',
                                  'Kipgehakt met tuinkruiden'),
                    'Ui': ("Rode ui",),
                    'Kipfilet': ('Kipfilet met tuinkruiden en knoflook',),
                    'Kipworst': ('Gekruide kipworst',),
                    'Kipshoarma': ('Kalkoenshoarma',)
                    }

The way you've defined it, the single-element entries are strings, so your iteration is unpacking the string (which is an iterable of characters) instead of a tuple of strings.

If you actually wanted your dictionary to be a mix of tuples and strings (I do not advise this -- consistent data types are much easier to work with), you could adapt your reverse comprehension to that by having it check whether each value v is a tuple or not:

>>> {x:k for k,v in ingredient_dict.items() for x in (v if isinstance(v, tuple) else (v,))}
{'Dunne frieten': 'Aardappelen', 'Half kruimige aardappelen': 'Aardappelen', 'Voorgekookte halve kriel met schil': 'Aardappelen', 'Kruimige aardappelen': 'Aardappelen', 'Roodschillige aardappelen': 'Aardappelen', 'Opperdoezer Ronde aardappelen': 'Aardappelen', 'Gemengd gekruid gehakt': 'Kipgehakt', 'Kipgehakt met Mexicaanse kruiden': 'Kipgehakt', 'Half-om-halfgehakt met Italiaanse kruiden': 'Kipgehakt', 'Kipgehakt met tuinkruiden': 'Kipgehakt', 'Rode ui': 'Ui', 'Kipfilet met tuinkruiden en knoflook': 'Kipfilet', 'Gekruide kipworst': 'Kipworst', 'Kalkoenshoarma': 'Kipshoarma'}
  • Related