2016-03-04 68 views
2

我有兩個變量,我想添加到使用collections.defaultdict(list) 這裏的字典是兩個變量:如果key,value對在字典中跳過蟒蛇

score = [0, 5, 7, 7, 8, 7] 
match = ['turtle', 'cat', 'horse', 'horse', 'dog', 'bear'] 

我想什麼做的是刪除字典中已有的鍵/值對。現在我用這個方法創建我的字典裏:

scoring = collections.defaultdict(list) 
    scoring[score].append(match) 

然而,這種方法給了我一本字典,像這樣:

dictionary = {0: ['turtle'], 5: ['cat'], 7: ['horse', 'horse', 'bear'], 8: ['dog']} 

但是,我只希望馬出現在字典一次。反正用這種方法來防止在字典中增加一個相同的鍵/值對嗎?

+3

如果你不關心訂購你可能會使用套。只需將defaultdict參數更改爲'set'和方法從'list.append'改爲'set.add'。 –

+0

....或者在defaultdict(list)之外使用第二個'defaultdict(set)'來查看已經添加了哪些元素。 –

回答

2

您可以使用set()代替list爲保留值:

>>> coring = defaultdict(set) 
>>> for i,j in zip(score, match): 
...  coring[i].add(j) 
... 
>>> coring 
defaultdict(<type 'set'>, {0: set(['turtle']), 8: set(['dog']), 5: set(['cat']), 7: set(['horse', 'bear'])}) 
>>> 

由於set對象不保留順序,如果你關心的值的項目的順序,你可以使用OrdereDict作爲值的容器:

>>> from collections import defaultdict, OrderedDict 
>>> coring = defaultdict(OrderedDict) 
>>> 
>>> for i,j in zip(score, match): 
...  coring[i][j]=None 
... 
>>> coring 
defaultdict(<class 'collections.OrderedDict'>, {0: OrderedDict([('turtle', None)]), 8: OrderedDict([('dog', None)]), 5: OrderedDict([('cat', None)]), 7: OrderedDict([('horse', None), ('bear', None)])}) 
>>> 
>>> coring[7] 
OrderedDict([('horse', None), ('bear', None)]) 
>>> coring[7].keys() 
['horse', 'bear'] 
+0

你對價值的順序意味着什麼?這是否意味着'{7:['horse','bear']}'和'{7:['bear','horse']}'之間沒有區別?是的,那沒關係。 – interstellar

+0

@interstellar我的意思是值的項目。如果它不重要,那麼您可以簡單地使用第一種方法。 – Kasramvd

+0

好的。我想我明白你的意思了。值的順序無關緊要,最終我會根據密鑰對字典進行排序。謝謝!! – interstellar

1

如果婉使用列表,而不是套保留,然後做過濾:

>>> d = defaultdict(list) 
>>> for k,v in zip(score, match): 
     if k not in d or v not in d[k]: 
      d[k].append(v) 


>>> d 
defaultdict(<class 'list'>, {0: ['turtle'], 8: ['dog'], 5: ['cat'], 7: ['horse', 'bear']}) 
+1

我也喜歡你的方法。謝謝! – interstellar

+0

Sure @interstellar .. :) –