2017-07-18 139 views
2

我不確定字典是否要走,但我做了一個包含1-7項目列表的字典。我想訪問列表中的任何項目的關鍵。這可能嗎?我找到了一種方法來訪問給定一個值的鍵(Get key by value in dictionary),但是如果有多個值呢?我的最終目標是重複一個字符串(字符串A),給定一個單獨的字符串(字符串B),它被分類在字符串A下。例如,'類別A'包含aa,bb,cc,'Cateogry B'包含a,b , C。 [aa,a,bb,aa,c,b,aa]的列表等於:[A,B,A,A,B,B,A]。這是我迄今的嘗試,但它不起作用。如何從多值字典中的任何指定值中獲取密鑰

dict = {'A':['aa', 'bb', 'cc'],'B':['a','b','c'] } 
nwlst = [] 
lst = [aa, a, bb, aa, c, b, aa] 
for i in lst: 
    if i in dict.values(): 
     nwlst.append([list(dict.keys())[list(dict.values()).index([str(i)])]]) 

也許使用像grep這樣的東西也可以工作,但我不知道如何實現這個概念。

回答

1

我想你在鏈接的問題中需要一些與the accepted answer非常相似的東西,而不是測試平等性,你會測試列入列表。另外,您忘記使用lst中的商品報價。

dict = {'A':['aa', 'bb', 'cc'],'B':['a','b','c'] } 
newlst = [] 
lst = ['aa', 'a', 'bb', 'aa', 'c', 'b', 'aa'] 
for search_v in lst: 
    for k, v in dict.items(): 
     if search_v in v: 
      newlst.append(k) 

還有其他選項,以及與鏈接問題中的其他答案有關。

例如,您可以如this answer那樣反轉字典。 你甚至可以用一個襯墊(未tetsted)

dict = {'A':['aa', 'bb', 'cc'],'B':['a','b','c'] } 
new_dict = {iv: k for k, v in dict.items() for iv in v} 

做到這一點,然後

newlst = [] 
lst = ['aa', 'a', 'bb', 'aa', 'c', 'b', 'aa'] 
for search_k in lst: 
    newlst.append(new_dict[search_k]) 

這有一個套了。

PS:正在搜索python反向字典在Google中給了你很多選擇。特別參見this

1

不確定您的最終目標,但字典不會用於這種情況。

一般來說,「按價值查找」並不是你想如何使用字典。如果確實如此,則應該翻轉鍵和值,以便最終將該值用作鍵。

dict = { 
    'aa': 'A', 
    'bb': 'A', 
    'cc': 'A', 
    'a': 'B', 
    'b': 'B', 
    'c': 'B', 
} 

這樣,你可以得到它正確因此,如果必須從價值到鍵入查找,然後給出了使用情況下,它更可能你把你原來的字典並把它變成這個版本的字典對於擡頭。

dict = {'A':['aa', 'bb', 'cc'],'B':['a','b','c'] } 
values_to_keys_dict = {} 
for key, values in dict: 
    for value in values: 
    values_to_keys_dict[value] = key 

lst = ['aa', 'a', 'bb', 'aa', 'c', 'b', 'aa'] 
for i in lst: 
    values_to_keys_dict[i] # To get the "key" 

這樣,你只掃描所有你的價值觀,而不是一次對每個lst掃描所有的值值。現在,這有一個警告,如果你的「值」設置具有相同的值,如{ 'A': ['a'], 'B': ['a'] }那麼這將「失去」多個鍵具有相同值的信息。

0

考慮Disjoint Set數據結構。使用聯合方法將['aa','bb','cc']和['a','b','c']製成不相交的子集後,Find方法將返回相應的父對象。

該結構可以用集合,列表,字典等實現。Here是一個相當不錯的實現,其他更多/更少複雜的實現可以很容易地在網絡上找到。

相關問題