2013-10-27 203 views
1

我有一個包含不同數量項目值的列表的字典。 我想比較這個詞典(dict1)的值與另一個(dict2)的鍵值,如果它們匹配,則打印dict1的匹配組件的鍵和值以及dict2的值。 這兩個字典都很大,目前這個過程太長了,你可以從這個基本的腳本中猜到。將一個字典的鍵與一個值列表比較一個字典到另一個字典

dict1 = {boys:[tom,jon],girls:[suzy]} 

dict2 = {suzy:paper-stapler-extraordinaire,jon:paper-shredderoligist,tom:garbage-specialist} 

輸出:

boys \t tom \t garbage-specialist 

    boys \t jon \t paper-shredderoligist etc..... 

for k,v in dict2.items(): 

    for key,value in dict1.items(): 
     if k in value[0]: 
      print str(key)+"\t"+str(value[0])+"\t"+v 
     if len(value)>1: 
      if k in value[1]: 
       print str(key)+"\t"+str(value[0])+"\t"+v 

可能有人提出了更大的內存有效的方法?也許是一個列表理解? 這一直沒有工作...... A = [在dict2 k代表k如果K的字典]

+0

如果您使用Python 2.x,請使用'iteritems'而不是'items'。 – falsetru

+0

速度真的會有所作爲嗎? – Vince

+0

['dict.items'](http://docs.python.org/2/library/stdtypes#dict.items)將項目作爲列表複製,而['dict.iteritems'](http:// docs .python.org/2/library/stdtypes#dict.iteritems)返回一個迭代器; 'dict.iteritems'更具記憶效率。 – falsetru

回答

1
for dict1_key, dict1_values in dict1.iteritems(): 
    for dict1_value in dict1_values: 
     try: 
      dict2_value = dict2[dict1_value] 
      print str(dict1_key) + '\t' + str(dict1_value) + '\t' + str(dict2_value) 
     except KeyError: 
      pass 

,結合一些技術來加快進行,並使用更少的內存。 iteritems使用較少的內存(如其他人所述)。通過使用try,然後使用dict2[dict1_value],可以確保dict2只搜索一次,然後使用散列算法,這應該比遍歷所有元素快得多。對於dict2中沒有dict1_value的所有情況,嘗試下的第一條語句失敗,導致catch塊無害化pass

+0

你的意思是「except」而不是「catch」? 這似乎很容易,但它從不打印任何東西。這真的是條件陳述:「dict2_value = dict2 [dict1_value]」?即使我刪除了try和catch之間的所有內容,並且只打印了dict2_value,也沒有任何東西會打印 – Vince

+0

@Vince是的,它應該是'except'。嘗試下的第一行是爲了分配,而不是條件語句。如果'dict2'缺少'dict1_value'鍵,該分配會導致錯誤,這會導致'try'塊結束並且'except'塊接管。隨着「except」的變化,然後輸入「dict1」和「dict2」,完全按照上面的問題,我得到了三行輸出(每個人在一個字符之間共享一行),包括'girls \ tsuzy \ tpaper-訂書機extraordinaire'。 –

+0

嗯。所以我的字典與上面的格式完全相同,除了不同的項目。此代碼不適用於他們。但是當我像上面這樣使用dict1和dict2時,這個工作。它們是如何創建的?具體來說,如果我以下面的方式創建了字典,然後使用上面的代碼,以這種方式指定值,它不起作用。有什麼不同? \ n dict2 [uid] = [] \ n dict2 [uid] .append(object) – Vince

2

您是否在尋找沿着線的東西:

[(k,i,dict2[i]) for k,v in dict1.items() for i in v if i in set(dict2.keys())] 

返回鍵,dict1和DIC2的價值的價值在dict1每個值是在dict2的關鍵。這可以被編輯以返回一個字符串,等等

此輸出:

[('boys', 'tom', 'garbage-specialist'), 
('boys', 'jon', 'paper-shredderoligist'), 
('girls', 'suzy', 'paper-stapler-extraordinaire')] 

集()上dict2.keys()是用來做主要的查找速度更快。

+0

我不斷收到TypeError:不可用類型:使用此 – Vince

+0

時出現'列表'錯誤我不知道如何解決這個問題。我認爲這是價值清單的問題,這就是爲什麼我最初問這個問題的原因。根據我的理解,這個聲明流程如下: 1)對於k,v in dict2 [v],對於k,v在dict1.items中,如果值在set dict2中,則打印任何內容。如果我刪除了設置的部分,錯誤消失了,但它打印出一個空的列表。該集合完成了什麼?謝謝。 – Vince

+0

該設置允許快速查找以查看值是否在鍵中。不幸的是,我最初查找的值是一個列表,列表是不可散列的(相反,您需要使用一個元組)。我已經改變了答案,以查找列表中的每個單獨的值。 – RMcG

相關問題