Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找具有重复值的字典键_Python_Dictionary - Fatal编程技术网

Python 查找具有重复值的字典键

Python 查找具有重复值的字典键,python,dictionary,Python,Dictionary,我想返回dict的键,它们的值存在不止一次 有人能告诉我如何实现这一点吗 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

我想返回dict的键,它们的值存在不止一次

有人能告诉我如何实现这一点吗

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)
使用
collections.defaultdict(set)
可以更有效地完成此操作。对于您的字典,
翻转的
将如下所示:

flipped = {}

for key, value in d.items():
    if value not in flipped:
        flipped[value] = [key]
    else:
        flipped[value].append(key)

首先,将字典翻转成一个反向的multidict,将每个值映射到它映射到的所有键。像这样:

{
    'Albert': ['nickname', 'firstname'],
    'Angel':  ['username'],
    'Likins': ['surname']
}
现在,您只需在multidict中查找值大于1的键。这很简单:

>>> 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)
除multidict键外,其他键均为原始dict值。因此,这是每个重复值,而不是所有匹配每个重复值的键。但是你知道什么是所有匹配每个重复值的键吗

>>> [key for key, values in rev_multidict.items() if len(values) > 1]
['Albert']
当然,这会给你一个集合列表。如果您想将其扁平化为单个列表或集合,这很容易。您可以使用
chain.from\u iterable
、嵌套理解或任何其他常用技巧。例如:

>>> [values for key, values in rev_multidict.items() if len(values) > 1]
[{'firstname', 'nickname'}]

此方法既不需要外部库,也不需要
if
语句:

>>> set(chain.from_iterable(values for key, values in rev_multidict.items() if len(values) > 1))
{'firstname', 'nickname'}

如果您的数据集不是太大,则不需要反向多指令集。您可以使用count on dict.values()并通过迭代dict.items()返回所需的键


希望这有帮助

此方法使用“try”和“for”

原始数据

desired_keys = []

vals = some_dict.values()

for key, value in some_dict.items():
   if vals.count(value) > 1:
        desired_keys.append(key)
代码

结果

reverse_dict = {}
for key, value in original_dict.items():
    try:reverse_dict[value].append(key)
    except:reverse_dict[value] = [key]
使用“defaultdict”:


你能自己尝试一下吗,哪怕是低效的尝试?这在概念上并不难。@Blender当然我有我的钥匙在这里。你能告诉我为什么你收集钥匙是成套的,而不仅仅是列表吗?毕竟,它们是唯一的。@StefanPochmann为什么不使用
集合
来处理一组没有意义顺序的固有唯一项呢?这正是它的目的。(取决于您以后对反向映射所做的操作,也可能有性能优势,但通常不会有;在这里使用它的主要原因是
set
是表示集合的一种明显方式。)嗯,这一点很好。设置速度较慢,占用更多内存,请看(我想你知道,但我想至少自己看看数字)。我习惯于只在我真正需要它们的时候才使用它们。但我明白你的意思,并同意它们以“有意义”的方式更有意义。现在我还没决定我更喜欢什么。是的,我明白了。我表达得很糟糕。时间/记忆并不是真正直接的问题,更重要的是集合让我觉得更“强大”,而对我来说,它们的力量在这里被浪费了。我想我主要是用它们来修饰东西,或者建立交叉点,或者在检查中使用快速
,所以不使用任何功能就使用它们似乎很奇怪。另外,我不喜欢写
set()
:-)。但是就像我说的,我明白你的意思,我可以看到,在
集合中有一个集合是很自然的,即使你不使用势能。对于这种情况,我可能会换成电视机。谢谢。@StefanPochmann:是的,
set()
(1,)
一起出现,语言上的一些“缺点”确实是Python的不幸之处,而不仅仅是抱怨的人不知道他在说什么的一个信号。嗯,明确地抓住KeyError会更好
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]
>>> 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 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)