some_dict = {"firstname": "Albert", "nickname": "Albert", "surname": "Likins", "username": "Angel"}
我想返回我的字典的键,其中它们的值存在不止一次。
有人可以告诉我如何实现这一点吗?
a_list = []
for k,v in some_dict.iteritems():
if v in some_dict.values() and v != some_dict.keys(k):
a_list.append(k)
首先,将字典翻转为反向多重字典,将每个值映射到它映射到的所有键。像这样:
>>> 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)
现在,您只需在多重字典中查找值大于 1 的键。这很简单:
>>> [key for key, values in rev_multidict.items() if len(values) > 1]
['Albert']
除了多字典键是原始字典值。因此,这是每个重复值,而不是与每个重复值匹配的所有键。但你知道匹配每个重复值的所有键是什么吗?
>>> [values for key, values in rev_multidict.items() if len(values) > 1]
[{'firstname', 'nickname'}]
当然,这会给你一个集合列表。如果您想将其扁平化为单个列表或集合,那很容易。您可以使用
chain.from_iterable
,或嵌套理解,或任何其他常用技巧。例如:
>>> set(chain.from_iterable(values for key, values in rev_multidict.items() if len(values) > 1))
{'firstname', 'nickname'}
flipped = {}
for key, value in d.items():
if value not in flipped:
flipped[value] = [key]
else:
flipped[value].append(key)
您可以使用
collections.defaultdict(set)
更有效地完成此操作。对于您的字典,
flipped
看起来像:
{
'Albert': ['nickname', 'firstname'],
'Angel': ['username'],
'Likins': ['surname']
}
if
语句:
reverse_dic = {}
for k, v in original_dic.iteritems():
reverse_dic[v] = reverse_dic.get(v, []) + [k]
行 reverse_dic[v] = reverse_dic.get(v, []) + [k]
替换了 4 行 if-else 代码
desired_keys = []
vals = some_dict.values()
for key, value in some_dict.items():
if vals.count(value) > 1:
desired_keys.append(key)
希望这有帮助!
from collections import defaultdict
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
d[k].append(v)
for key, value in d.items():
if len(value) > 1:
print "key: %s has multiple values: %r" % (key, value)
try
和
for
。原始数据
original_dict = {"firstname":"Albert", "nickname":"Albert", "surname":"Likins", "username":"Angel"}
代码
reverse_dict = {}
for key, value in original_dict.items():
try:reverse_dict[value].append(key)
except:reverse_dict[value] = [key]
此方法使用dict.get()
。
reverse_dict = {}
for k, v in original_dict.items():
reverse_dict[v] = reverse_dict.get(v, []) + [k]
结果
>>> reverse_dict
{'Albert': ['firstname', 'nickname'], 'Likins': ['surname'], 'Angel': ['username']}
>>> [value for key, value in reverse_dict.items() if len(value) > 1]
[['firstname', 'nickname']]
from collections import Counter
[k for k, v in some_dict.items() if v in {v for v, count in Counter(some_dict.values()).items() if count > 1}]