我在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唯一。
答案 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)