2012-07-20 63 views
0

我有兩個字典,我喜歡根據某些標準比較他們的dict_values,比如索引0和索引值2在它們各自的dict_values必須是相同的視爲平等。比較基於特定標準的兩個dict_values的值

此代碼:

a = dict() 
b = dict() 
a[1,3] = 5, 6, 7 
b[1,4] = 5, 9, 7 
a_tuple = (list(a.values()))[0] 
b_tuple = (list(b.values()))[0] 
if a_tuple[0] == b_tuple[0] and a_tuple[2] == b_tuple[2]: 
    print('Equal') 

有沒有做到這一點更短的/有效的方式?

在此先感謝!

約翰

+0

你爲什麼要這麼做?根據字典中的第一個值(比如你正在做的)進行比較是很可疑的,因爲字典中沒有第一個值(它們是無序的)。 - 當然,如果它們只有1個元素,它會很好(因爲1個元素的無序集合具有明確定義的順序 - 很奇怪......),但是如果您有多個元素,它可能不起作用字典。 – mgilson 2012-07-20 19:20:57

+0

按照說法繼承遺留代碼,dict_values中只有一個元素用於比較。 – JohnX 2012-07-20 19:27:03

回答

1

我不知道這是好多了,但下面應該工作:

import operator 
import sys 

py3k = sys.version_info[0] > 2 

a = dict() 
b = dict() 
a[1,3] = 5, 6, 7 
b[1,4] = 5, 9, 7 

if(py3k): 
    a_tuple = next(iter(a.values())) 
    b_tuple = next(iter(b.values())) 
else: 
    a_tuple = a.values()[0] 
    b_tuple = b.values()[0] 

cmp_key=operator.itemgetter(0,2) 
if cmp_key(a_tuple) == cmp_key(b_tuple): 
    print('Equal') 

的比較多一點乾淨,我用nextiter拿到第一如果使用python 3.

當然,更好的解決方案是改變數據結構,這樣你就不會一直處理只有1項的字典。

+0

謝謝,今天學點新東西。 – JohnX 2012-07-20 19:47:44

+0

我每天都在嘗試學習一些東西(在嘗試之前我並不知道「iter」是否會起作用)。 – mgilson 2012-07-20 19:58:26

+0

@JohnX - 另請注意,'next(iter(a.values()))'也可以在python2上工作,它可能只是比索引效率低,但可能值得使用來擺脫愚蠢的'if- else條款。 – mgilson 2012-07-20 20:00:15

0

沒有太大的區別,只是我發現優化 a_tuple = a.values()[0] b_tuple = b.values()[0]

其實dict.values只給你元組。你正在把它列出來,然後再一次到元組

+0

如果使用python3,則需要將其轉換爲其他類型。 – mgilson 2012-07-20 19:37:06

+0

對不起,我沒有注意到 – 2012-07-20 19:43:58