在字典中找到一个值,然后获取密钥

时间:2018-10-04 12:59:50

标签: python algorithm dictionary

我正在使用Python3。我有3个组,在这些组中,我有多个值。 enter image description here

我拥有所寻找的价值,并且希望得到他的支持。例如,如果我有CCC,我需要得到GROUP 1;如果我有HHH,我要GROUP 3,然后根据组别进行操作。

所以我想我要创建一个这样的字典(如果我错了,请告诉我):

{
  'group1': {'AAA','BBB','CCC','DDD'}, 
  'group2': {'EEE','FFF','GGG'},
  'group3': {'HHH','JJJ'}
}

所以我看到我们可以还原dict以从值中获取键,所以我想这样做:

dict = {
  'group1': {'AAA','BBB','CCC','DDD'},
  'group2': {'EEE','FFF','GGG'},
  'group3': {'HHH','JJJ'}
}

revdict = dict([(dict[key],key) for key in dict])

group = revdict['CCC']
if group == 'group1':
    # Do something
elif group == 'group2':
    # Do something
elif group == 'group3':
    # Do something

但是我不认为这是做我想要的事情的好方法。有一种方法可以执行以下操作:

if 'CCC' in dict :
    # Then get the current key. How ?

或者也许我不需要创建dict而是其他东西?我接受您的所有建议。

4 个答案:

答案 0 :(得分:1)

您反转的dict(通常称为反转索引)将失败,因为您将集合用作键。集合是可变的,不能将它们散列以形成dict键。取而代之的是,您可能希望组中的每个元素组成一个密钥。

您可以使用defaultdict重写正确的反向索引。

from collections import defaultdict

groups = {
    'group1': {'AAA', 'BBB', 'CCC', 'DDD'},
    'group2': {'EEE', 'FFF', 'GGG'},
    'group3': {'HHH', 'JJJ'}
}

inverted_index = defaultdict(set)

for name, group in groups.items():
    for element in group:
        inverted_index[element].add(name)

print('group1' in inverted_index['AAA']) # True
print('group1' in inverted_index['EEE']) # False

在倒排索引中,一个元素可能具有指向它的多个键(即使您的数据中不是这种情况),这就是每个值必须是键的set的原因。

如果您在评论中似乎已经声明过,如果确保您的数据仅具有一对一的对应关系,那么您只需创建一个dict

inverted_index = {element: name for name, group in groups.items() for element in group}
print(inverted_index)

输出

{'AAA': 'group1',
 'BBB': 'group1',
 'CCC': 'group1',
 'DDD': 'group1',
 'EEE': 'group2',
 'FFF': 'group2',
 'GGG': 'group2',
 'HHH': 'group3',
 'JJJ': 'group3'}

答案 1 :(得分:0)

您可以使用 list comprehension 来检索key,并且仅在您要查找的key位于str中时返回values

d = {
  'group1': {'AAA','BBB','CCC','DDD'},
  'group2': {'EEE','FFF','GGG'},
  'group3': {'HHH','JJJ'}
}

a = [i for i in d if 'CCC' in d[i]]
# ['group1']

答案 2 :(得分:0)

我坚持不使用索引作为键,

answer = None
for key in d.keys():
   if "CCC" in d[key]:
      answer = key
      break

* @ Olivier建议的编辑

答案 3 :(得分:0)

for k,v in dict.items():
   if 'CCC' in v:
      print(k)

您无法逃脱循环或逆向指令。如果您没有内存限制,请使用逆向字典。