2017-07-26 58 views
2

對於len> 1的字典值中的每個項目,我都在使用len == 1搜索另一個字典值中的項目。我在len == 1的另一個字典值中找到該項目,我想從較長的值中刪除它。例如:查找字典值中的項目,在長度爲1的另一個字典值中查找

d = { 
    'key1' : ['one', 'two', 'three'], 
    'key2' : ['one'], 
    'key3' : ['two', 'three'], 
    } 

應該返回

{ 
'key1' : ['two', 'three'], 
'key2' : ['one'], 
'key3' : ['two', 'three'], 
} 

我當前的代碼爲這個

allvals = match.values() 

for k, v in match.iteritems(): 

    dontuse = [] 
    newval = [] 

    for i in v: 
     for x in allvals: 
      if x == v: 
       pass 
      elif i in x: 
       if len(x) == 1: 
        dontuse.append(i) 
    for i in v: 
     if i in dontuse: 
      pass 
     else: 
      newval.append(i) 

    match[k] = list(set(newval)) 

然而,這是一個極端的瓶頸與處理時間。任何幫助將不勝感激,謝謝!

+0

您的解決方案是否正常工作? – wwii

+0

我的解決方案可行,使用大型詞典(潛在100,000多個鍵)時,速度非常慢。 – Dylan

+0

在你的輸出中,'dict [key2]'是'['one']還是'[]'? – Will

回答

1

您只需要遍歷字典一次即可找到dontuse。然後,你剛纔複製的字典上,根據需要長度大於1。一對夫婦列表和字典推導的一個簡潔的解決方案更大的名單留出列表中的條目:

dontuse = {s for val in match.values() for s in val if len(val) == 1} 
match = {key: [s for s in val if len(val) == 1 or not s in dontuse] for key, val in match.iteritems()} 

此外,最好不要使用dict或任何其他內置的變量名稱。

+0

中移除'one',以便爲'dontuse'使用'set()',集合中的查找爲'O(1) vs'O(n)'列表。 – AChampion

+0

@AChampion謝謝,很好。 – perigon

+0

感謝您的幫助,甚至從來沒有跨過我的腦海,重複一遍以找到dontuse第一。你的兩個解決方案都是完美的。 – Dylan

1

這是一個有點難以解釋你正在嘗試做的,但我相信你可以打破它分爲2步:

  • 創建一組項目,以消除
  • 刪除物品清單,LEN> 1

這兩個可與內涵(集,字典),例如來完成:

>>> d = { 'key1' : ['one', 'two', 'three'], 'key2' : ['one'], 'key3' : ['two', 'three']} 
>>> r = {v[0] for k, v in d.items() if len(v) == 1} 
>>> {k: [v for v in vs if v not in r] if len(vs) > 1 else vs for k, vs in d.items()} 
{'key1': ['two', 'three'], 'key2': ['one'], 'key3': ['two', 'three']} 
1

我首先想到的是使用套件:

match = { 1 : ['one', 'two', 'three'], 2 : ['one'], 3 : ['two', 'three'] } 

singles=set() 
for v in match.values(): 
    if len(v)==1: 
     singles.add(v[0]) 


for k, v in match.iteritems(): 
    if len(v)>1: 
     for el in v: 
      if el in singles: 
       match[k].remove(el) 

match 
{1: ['two', 'three'], 2: ['one'], 3: ['two', 'three']}