2016-04-04 45 views
3

我有一個整數列表(標籤)。我想將列表項目映射到字典(類)的值項目並獲取相應的字典鍵作爲輸出。無法匹配元組項目列表項目

我使用:

h = classes.items() 
for x in tags: 
    for e in h: 
     # print x, e, # uncomment this line to make a diagnosis 
     if x == e[1]: 
      print e[0] 
     else: 
      print "No Match" 

Classes是字典。 Tags是我想要與類映射的項目列表。當我運行這個代碼時,我在輸出處得到2616時間No Match

2616 = 8 (no. of tuples)*327 (no. of items of tags list) 
+0

嘗試在if語句之前添加一行打印x,e。這將幫助您瞭解爲什麼比較不起作用。您可能希望在此分享您的輸出摘錄以獲得幫助。 – gauden

+0

你可以發佈'class.items()'和'tags'的樣本嗎? –

+0

@gauden 爵士我得到: 利物浦@甘道夫:〜/升/升$蟒蛇test.py 回溯(最近通話最後一個): 文件「的考驗。PY」 57行,在 打印X,E NameError:名字‘E’是沒有定義 因爲變數e啓動內第二‘for’循環 – nainometer

回答

2

如果我明白你正在嘗試,也許這樣做將有助於

>>> tags 
['0', '2', '1', '3', '4', '7', '2', '0', '1', '6', '3', '2', '8', '4', '1', '2', '0', '7', '5', '4', '1'] 
>>> classes 
{'Tesla': 7, 'Nissan': 0, 'Honda': 5, 'Toyota': 6, 'Ford': 1, 'Mazda': 4, 'Ferrari': 2, 'Suzuki': 3} 

tags是一個列表的字符串,而不是整數 - 所以我們把它轉換爲一個整數列表。

>>> tags = map(int, tags) 

classes是一個字典映射汽車製造到整數,但我們希望使用的值作爲查找。我們可以反轉詞典(SWAP鍵和值)

>>> classes_inverse = {v: k for k, v in classes.items()} 

現在這是什麼tagsclasses_inverse樣子

>>> tags 
[0, 2, 1, 3, 4, 7, 2, 0, 1, 6, 3, 2, 8, 4, 1, 2, 0, 7, 5, 4, 1] 
>>> classes_inverse 
{0: 'Nissan', 1: 'Ford', 2: 'Ferrari', 3: 'Suzuki', 4: 'Mazda', 5: 'Honda', 6: 'Toyota', 7: 'Tesla'} 

現在,我們可以收集逆字典的值列表中的每個項目。

>>> [classes_inverse.get(t, "No Match") for t in tags] 
['Nissan', 'Ferrari', 'Ford', 'Suzuki', 'Mazda', 'Tesla', 'Ferrari', 'Nissan', 'Ford', 'Toyota', 'Suzuki', 'Ferrari', 'No Match', 'Mazda', 'Ford', 'Ferrari', 'Nissan', 'Tesla', 'Honda', 'Mazda', 'Ford'] 
+0

非常感謝。 問題在於當我在for循環中比較字符串和整數時,'tags'是一個字符串列表。感謝數十億的「地圖」功能。它在轉換後像一個魅力。 – nainometer

0

對於每個標籤,您遍歷所有的鍵,並打印它是否匹配,除了最多隻有一次打擊時。例如,如果您有10個項目,對於每個標籤,您將打印1次擊中和9次未擊中。

既然你想存儲這些數據,最簡單的方法就是反轉字典映射,即使鍵 - >值變爲值 - >鍵。然而,這假定所有的值都是唯一的,這就是你的例子所暗示的。

def map_tags(tags, classes): 
    tag_map = {value: key for key, value in classes.items()} 
    return [tag_map.get(t, 'No match') for t in tags] 

但是,要小心。在您的classes示例中,值是整數,而標記是字符串。你希望兩人在製作地圖時匹配。如果標籤旨在爲字符串,然後更改

tag_map.get(t, 'No match') 

tag_map.get(int(t), 'No match')