簡體   English   中英

在字典中找到一個值,然后獲取密鑰

[英]Find a value in dict then get the key

我正在使用Python3。我有3個組,在這些組中,我有多個值。 在此處輸入圖片說明

我具有所尋找的價值,並且希望得到他的支持。 例如,如果我有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而是其他東西? 我接受您的所有建議。

您的反向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'}

您可以使用列表推導來檢索key並且僅在要查找的str包含其values時才返回key

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']

我堅持不使用索引作為密鑰,

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

* @ Olivier建議的編輯

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

您無法逃避循環或反向指令。 如果您沒有內存限制,請使用逆向字典。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM