2015-11-26 65 views
2

我有一個包含n個鍵值對的python字典,其中n-1個值相同,而1個不是。我需要找到獨特元素的關鍵。查找python字典中是否有不同的元素

例如:考慮python list [{a:1},{b:1},{c:2},{d:1}]。我需要獲得'c'作爲輸出。

我可以使用for循環來比較連續的元素,然後使用兩個for循環來比較這些元素與其他元素。但是有沒有一種更有效的方法去實現它,或者是一種我不知道的內置函數?

+0

我能找到與此代碼稍加改進了答案。 http://stackoverflow.com/questions/1032281/python-finding-keys-with-unique-values-in-a-dictionary – TheFallenOne

+1

如果n-1值相同,則只需要一個for循環。只要你看到兩個不同的值,你就知道它是哪一個。 –

+0

@El'endiaStarman好點 - 雖然如果唯一一個是前兩個之一,你將不知道它是哪一個,直到你看到第三個元素。 –

回答

2

如果你有一本字典,你可以快速檢查並找到第一個值,這是不同的下一個值循環你的字典的鍵。

下面是一個例子:

def find_different(d): 
    k = d.keys() 
    for i in xrange(0, len(k)): 
     if d[k[i]] != d[k[(i+1)%len(k)]] and d[k[i]] != d[k[(i+2)%len(k)]]: 
      return k[i] 

>>> mydict = {'a':1, 'b':1, 'c':2, 'd':1} 
>>> find_different(mydict) 
'c' 

否則,如果您有什麼是單鍵詞典列表,那麼你就可以做到這一點很好地與函數映射列表該「提取」從價值觀你的元素,然後使用相同的邏輯檢查每個元素。

下面是另一個工作示例:

def find_different(l): 
    mask = map(lambda x: x[x.keys()[0]], l) 
    for i in xrange(0, len(l)): 
     if mask[i] != mask[(i+1)%len(l)] and mask[i] != mask[(i+2)%len(l)]: 
      return l[i].keys()[0] 

>>> mylist = [{'a':1},{'b':1},{'c':2},{'d':1}] 
>>> find_different(mylist) 
'c' 

注意:這些解決方案並不在Python 3工作作爲map功能不返回list而且也沒有字典的.keys()方法。

0

如果你已經有你的字典,那麼你列出所有的鍵:key_list = yourDic.keys()。使用該列表,您可以循環查看您的字典。如果你知道其中的一個值,這很容易,但在下面我假設你不知道。

yourDic = {'a':1, 'b':4, 'c':1, 'd':1, } 
key_list = yourDic.keys() 
previous_value = yourDic[key_list[0]] # Making it so loop gets past first test 
count = 0 
for key in key_list: 
    test_value = yourDic[key] 
    if (test_value != previous_value) and count == 1: # Checks first key 
     print key_list[count - 1] 
     break 
    elif (test_value != previous_value): 
     print key 
     break 
    else: 
     previous_value = test_value 
     count += 1 

因此,一旦您找到不同的值,它將打印密鑰。如果你想要它打印的價值,你只需要一個print test_value語句

+0

這在很多層面上都是錯誤的:首先,OP沒有談論字典,而是談論字典列表;那麼你正在檢查每個項目的正確的兄弟,所以如果不同的元素是列表中的第一個,你的方法將無法正確識別它。 –

+0

我複製並粘貼了前一個。它已經被修復了。哦,OP的例子有一個列表,但是特別詢問了「包含n個鍵值對的Python字典」,而且問題的標題特別提到了字典,所以這是我回答的問題 – dkhamrick

+0

我必須承認,OP的示例具有誤導性... –

1

假設不能改變你的(實際上字典的名單,嘆息)「對錶」:

from collections import defaultdict 

def get_pair(d): 
    return (d.keys()[0], d.values()[0]) 

def extract_unique(l): 
    d = defaultdict(list) 
    for key, value in map(get_pair, l): 
     d[value].append(key) 
    return filter(lambda (v,l): len(l) == 1, d.items())[0][1] 
相關問題