2014-02-20 23 views
1

我有這樣一本字典:返回值從獨特的元素在字典

d = {'v03':["elem_A","elem_B","elem_C"],'v02':["elem_A","elem_D","elem_C"],'v01':["elem_A","elem_E"]} 

你怎麼會返回一個新的字典,這是不包含在最高價值的關鍵要素? 在這種情況下:

d2 = {'v02':['elem_D'],'v01':["elem_E"]} 

謝謝

+0

你應該告訴我們你到目前爲止所嘗試過的。提示:查看「過濾器」和「不在」的條件,並試一試。 – ssm

+1

最高值**的**鍵意味着什麼?它是在排序所有鍵的基礎上,這些都是字符串? – eyquem

回答

0
from collections import defaultdict 
myNewDict = defaultdict(list) 
all_keys = d.keys() 
all_keys.sort() 
max_value = all_keys[-1] 
for key in d: 
    if key != max_value: 
     for value in d[key]: 
      if value not in d[max_value]: 
       myNewDict[key].append(value) 

您可以通過採取在d [MAX_VALUE]的數值之間的差集其他每個按鍵的獲得與集合運算票友,但第一我認爲你應該習慣使用字典和列表。

defaultdict(<type 'list'>, {'v01': ['elem_E'], 'v02': ['elem_D']}) 

不使用集合的一個原因是解決方案沒有足夠的泛化,因爲集合只能有可哈希對象。如果你的值是列表列表,那麼成員(子列表)是不可散列的,所以你不能使用集合操作。

0

根據你的python版本,你可以使用dict comprehension來完成這個工作:

>>> d2 = {k:[v for v in values if not v in d.get(max(d.keys()))] for k, values in d.items()} 
>>> d2 
{'v01': ['elem_E'], 'v02': ['elem_D'], 'v03': []} 

這種拼字典d的副本包含列表被剝去存儲在MAX鍵的所有項目。由此產生的字典看起來或多或少像你要去的。 如果你不想在關鍵v03空單,包裹在另一字典結果本身:

>>> {k:v for k,v in d2.items() if len(v) > 0} 
{'v01': ['elem_E'], 'v02': ['elem_D']} 

編輯: 如果你原來的dict有一個非常大的密鑰集[或者說需要頻繁操作],您可能還想用某個先前分配的列表變量替換表達式d.get(max(d.keys()))以獲得性能[ ,但我不確定它是否實際上無論如何都不會預先計算出來 ]。 這加快了整個事情幾乎100%。下面在我的機器上運行1.5秒後運行100,000次,而未被表達的時間超過3秒。

>>> bl = d.get(max(d.keys())) 
>>> d2 = {k:v for k,v in {k:[v for v in values if not v in bl] for k, values in d.items()}.items() if len(v) > 0} 
1

我更喜歡與爲它設計的內建數據類型有差異:集合。

最好是編寫循環而不是詳盡的理解。單線是聰明的,但可以理解的代碼,你可以返回並理解甚至更好。

d = {'v03':["elem_A","elem_B","elem_C"],'v02':["elem_A","elem_D","elem_C"],'v01':["elem_A","elem_E"]} 

last = None 
d2 = {} 
for key in sorted(d.keys()): 
    if last: 
     if set(d[last]) - set(d[key]): 
      d2[last] = sorted(set(d[last]) - set(d[key])) 
    last = key 

print d2 
{'v01': ['elem_E'], 'v02': ['elem_D']} 
+0

使用set操作是實現所需目標的一種優雅方式。程序方法允許非常快的執行。然而,我不同意爲了可理解性而選擇程序循環而不是列舉/詞典理解的動機。當涉及到可讀性時,我會盡可能使用理解性能的缺點似乎是合理的,因爲與它們一起表達的緊湊性和自由度。特別是當格式化爲多行時,理解能比等效的循環結構更容易閱讀。這可能歸結爲個人偏好。 [1] –