Dictionary:检查value[1]是否存在于双值元组中,并且是否给出与第一次出现时相同的值[0]



我正在使用一个字典,该字典在元组中具有一个键和两个值,其中第一个值只是临时默认值,第二个值是确定值。字典看起来就像这样:

my_dict = {b:("num","bread"), a:("num","arm"), d:("num","desk"), aa:("num","arm"),
c:("num","check"), aaa:("num","arm"), dd:("num","desk"), f:("num","film")}

我想做的是添加一个递增的数字而不是"num",但如果第二个值是重复的(如"arm""desk"),那么该数字应该与第一次出现的数字相同。所以上面的列表应该是这样的:

my_dict = {b:(1,"bread"), a:(2,"arm"), d:(3,"desk"), aa:(2,"arm"), c:(4,"check"),
aaa:(2,"arm"), dd:(3,"desk"), f:(5,"film")}

这是我自己的想法:

c = 0
saved = []
for key, value in my_dict.items():
if not value[1] in saved:
saved.append(value[1])
self.citations_dictionary[key] = c, value[1]
c += 1

它工作,但现在我不知道如何检查重复的值,以及如何分配第一次出现的数字。

首先创建一个字典来保存递增的数字。然后,您可以使用它来创建新字典。

indexes = {}
counter = 0
for _, value in my_dict.values():
if value not in indexes:
counter += 1
indexes[value] = counter
new_dict = {key: (indexes[value], value) for key, (_, value) in my_dict.items()}

您可以使用defaultdict并引用其自身长度作为计数器:

from collections import defaultdict
d = defaultdict(lambda: len(d)+1)
out = {k: (d[v[1]], v[1]) for k,v in my_dict.items()}

输出:

{'b': (1, 'bread'),
'a': (2, 'arm'),
'd': (3, 'desk'),
'aa': (2, 'arm'),
'c': (4, 'check'),
'aaa': (2, 'arm'),
'dd': (3, 'desk'),
'f': (5, 'film')}

使用itertools.count的更简单的替代方案:

from collections import defaultdict
from itertools import count
d = defaultdict(lambda c=count(1): next(c))
out = {k: (d[v[1]], v[1]) for k,v in my_dict.items()}

最新更新