在python中的字典中查找重复值并重命名

时间:2019-05-09 16:45:30

标签: python dictionary

我在python中有一个dict,如下所示-

{'1386': 'USA', '23113': 'Russia', '23295': 'Russia', '73535': 'Japan' , '12355': 'Japan', '65447': 'Japan'}

键是不同的且唯一的,但是字典中的值可以有通用名称。有没有办法我可以找到多少个通用名称并在其末尾添加一个唯一的数字?喜欢-

from random import randint
randint(100, 999)
{'1386': 'USA', '23113': 'Russia', '23295': 'Russia345', '73535': 'Japan' , '12355': 'Japan223', '65447': 'Japan789'}

公共项中的第一个值保持不变,但其他值的末尾将添加一个随机数-Russia345, Japan223, Japan789

我无法找到一种方法来做到这一点。我应该逆转命令并编写逻辑吗?

尝试此方法的原因是当我根据Value将数据发送到Grafana时,因为需要显示值,所以在输出中仅显示一个Value,所以我想使Values唯一。

3 个答案:

答案 0 :(得分:2)

在将键/值对添加到字典之前,请检查该值是否已在字典中,如果有,则在其中添加一些内容。

while value in mydict.values():
    value = value + "something"
mydict[key] = value

答案 1 :(得分:1)

您可以使用字典来存储每个值的出现:

import random
d = {'1386': 'USA', '23113': 'Russia', '23295': 'Russia', '73535': 'Japan' , '12355': 'Japan', '65447': 'Japan'}
c, result = {b:[] for b in d.values()}, {}
for a, b in d.items():
   if not c[b]:
     c[b].append('')
     result[a] = b
   else:
     _num = random.randint(100, 999)
     while _num in c[b]:
       _num = random.randint(100, 999)
     c[b].append(_num)
     result[a] = b+str(_num)

输出:

{'1386': 'USA', '23113': 'Russia', '23295': 'Russia513', '73535': 'Japan', '12355': 'Japan383', '65447': 'Japan517'}

但是,只需使用itertools.count中的计数器,就可以大大简化此操作:

import itertools
c = {b:itertools.count() for b in d.values()}
result = {a:(lambda x:b if not x else b+str(x))(next(c[b])) for a, b in d.items()}

输出:

{'1386': 'USA', '23113': 'Russia', '23295': 'Russia1', '73535': 'Japan', '12355': 'Japan1', '65447': 'Japan2'}

答案 2 :(得分:0)

这里的困难之一是要确保后缀是随机的 唯一。重试方法可能会永远循环。您应该使用random.shuffle。我们最多需要len(d)-1个随机数(在所有键都映射到相同值的情况下)。

>>> d = {'1386': 'USA', '23113': 'Russia', '23295': 'Russia', '73535': 'Japan' , '12355': 'Japan', '65447': 'Japan'}
>>> import random
>>> L = list(range(1, len(d)))
>>> random.shuffle(L)
>>> L
[3, 1, 5, 4, 2]

我们将“按需”使用这些唯一的随机数。我们存储为避免重复而在集合中看到的值,并且每次遇到seen键时,都会从列表中弹出一个后缀:

>>> seen = set()
>>> for k, v in d.items():
...     if v in seen:
...             d[k] = v+str(L.pop())
...     else:
...             seen.add(v)
...
>>> d
{'1386': 'USA', '23113': 'Russia', '23295': 'Russia2', '73535': 'Japan', '12355': 'Japan4', '65447': 'Japan5'}

(相关:Fisher Yates shuffle