lzc*_*lzc 15 python dictionary
__CODE__
我想把我们的词典的关键字归还给他们的价值,这些关键词存在了不止一次.
有人可以告诉我如何实现这个吗?
some_dict = {"firstname": "Albert", "nickname": "Albert", "surname": "Likins", "username": "Angel"}
Run Code Online (Sandbox Code Playgroud)
aba*_*ert 22
首先,将字典翻转成反向多字节,将每个值映射到它映射到的所有键.像这样:
>>> some_dict = {"firstname":"Albert","nickname":"Albert","surname":"Likins","username":"Angel"}
>>> rev_multidict = {}
>>> for key, value in some_dict.items():
... rev_multidict.setdefault(value, set()).add(key)
Run Code Online (Sandbox Code Playgroud)
现在,您只是在寻找具有多于1个值的multidict中的键.这很简单:
>>> [key for key, values in rev_multidict.items() if len(values) > 1]
['Albert']
Run Code Online (Sandbox Code Playgroud)
除了multidict键之外,还有原始的dict值.因此,这是每个重复的值,而不是与每个重复值匹配的所有键.但是你知道匹配每个重复值的所有键是什么?
>>> [values for key, values in rev_multidict.items() if len(values) > 1]
[{'firstname', 'nickname'}]
Run Code Online (Sandbox Code Playgroud)
当然,这会给你一个集合列表.如果您想将其展平为单个列表或集合,那很容易.您可以使用chain.from_iterable,或嵌套理解,或任何其他常用技巧.例如:
>>> set(chain.from_iterable(values for key, values in rev_multidict.items() if len(values) > 1))
{'firstname', 'nickname'}
Run Code Online (Sandbox Code Playgroud)
Ble*_*der 15
我会从翻转键和值开始:
flipped = {}
for key, value in d.items():
if value not in flipped:
flipped[value] = [key]
else:
flipped[value].append(key)
Run Code Online (Sandbox Code Playgroud)
你可以更有效地做到这一点collections.defaultdict(set).对于您的字典,flipped将看起来像:
{
'Albert': ['nickname', 'firstname'],
'Angel': ['username'],
'Likins': ['surname']
}
Run Code Online (Sandbox Code Playgroud)
此方法既不需要外部库也不需要if语句:
reverse_dic = {}
for k, v in original_dic.iteritems():
reverse_dic[v] = reverse_dic.get(v, [])
reverse_dic[v].append(k)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
43074 次 |
| 最近记录: |