2013-07-10 67 views
2

我正在使用「添加」和「設置」將值作爲值輸入到字典鍵。事情是,我的字典鍵是一個字符串。所以,我不能使用「append」將列表作爲值。因此,我使用「添加」和「設置」附加到值。但他們不會在列表中允許重複。我如何更改我的代碼以允許重複?我的部分代碼如下:當使用集合時,如何在字典中允許重複值

if myKey in myDict.keys(): 
    myDict[myKey].add(value) 
else: 
    myDict[mykey] = set([value]) 

這裏,value是一個浮點數。例如,如果myKey是「abcd」並且它的值列表是[1.5,2.5,3.5,1.5],通過使用上面的代碼,我只能得到['abcd':1.5,2.5,3.5]。我如何更改代碼以允許重複值而不使用append?提前致謝。

+4

您可以讓該鍵是一個字符串,仍然有一個值列表。 – BrenBarn

回答

4

我的字典鍵是一個字符串。所以,我不能有名單作爲價值使用 「追加」

事實並非如此。你可以有字符串作爲鍵和列表作爲值:

myDict = {} 
myDict.setdefault(myKey, []).append(value) 

第二個參數中myDict.setdefault(myKey, [])是默認值。如果myKey不在myDict中,則返回默認值。 (這裏是一個link to the docs。)

或者,你可以使用一個collections.defaultdict

import collections 
myDict = collections.defaultdict(list) 
myDict[myKey].append(value) 

不同於常規dict,如果myDictdefaultdict然後myDict[anyKey]將在myDict不會返回一個空列表的任意鍵。


1

您不能在set中存儲重複值。這是關鍵的一點。

您似乎也期待set保持秩序。它不這樣做。對於小案例來說,似乎是這樣,但是如果您編寫依賴於它的代碼,它將會中斷。

那麼,什麼是類似set的類型,但允許重複的值和保留順序? list

鍵類型與您可以具有的值類型沒有任何關係。即使這樣做,也很難明白爲什麼setlist會採取不同的行爲。在這種情況下。

所以:

if myKey in myDict.keys(): 
    myDict[myKey].append(value) 
else: 
    myDict[mykey] = [value] 

注意,您可以通過使用setdefault簡化了整個事情:

myDict.setdefault(myKey, []).append(value) 

...或使用collections.defaultdict

myDict = defaultdict(list) 
# ... 
myDict[myKey].append(value) 
1

使用defaultdictlist default_工廠

from collections import defaultdict 
d = defaultdict(list) 
for x in [1.5,2.5,3.5,1.5]: 
    d['abcd'].append(x) 

print d 
defaultdict(<type 'list'>, {'abcd': [1.5, 2.5, 3.5, 1.5]})