反向字典映射不正确

huangapple go评论77阅读模式
英文:

Reverse dictionary mapping incorrectly

问题

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'}
英文:

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'}

答案1

得分: 2

如果你想让ingredient_dict中的每个值都是一个元组,你需要在括号内加上一个逗号:

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',)
                    }

按照你当前的定义,单元素的条目是字符串,因此你的迭代会拆分字符串(字符串是字符的可迭代对象)而不是字符串的元组。

如果你确实希望你的字典是元组和字符串的混合(我不建议这样做——一致的数据类型更容易处理),你可以通过在反向推导中检查每个值v是否是元组来进行适应:

>>> {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'}
英文:

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'}

huangapple
  • 本文由 发表于 2023年1月9日 08:08:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/75052191.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定