2013-11-03 47 views
1

做一些網頁刮,結果組合之後,我留下的字典的列表。其中一個鍵(標題)是列表的列表。列表/字典數據操作 - 刪除重複

thelist = [{"name":"a name", "titles":[["foo","bar", ... ],["foo","baz",["..."], ... ]]}, 
{"name":"another name", "titles":[["foo","bar", ... ],["foo","baz",["..."], ... ]]}, ... ] 

的目標是消除在每個字典標題的列表中出現在不止一個列表標題和與標題的一個列表(不重複)替換名稱的名單列表。

我已經寫了現在的代碼正確地訪問在列表清單中的所有項目,但我有困難,實際上做重複的消除。

match = "" 
for dicts in thelist: 
    for listoftitles in dicts['titles']: 
     for title in listoftitles: 
      title = match 
     for title in listoftitles: 
      if match == title: 
       print title 
       #del title 

看來,匹配永遠不等於標題中的值。我試圖改變循環嵌套但至今無果。我越來越迷失的地方,我不知道什麼嘗試。任何意見是極大的讚賞。

回答

1

的慣用方式來獲得一個名單沒有重複是list(set(some_iterable))

扔在一個列表理解,我們得到

thelist = [{'name': 'a name', 'titles': [['foo','bar'],['foo','baz']]}] 

print [ 
    { 
     'name': d['name'], 
     'titles': list(set(title for lst in d['titles'] for title in lst)) 
    } 
    for d in thelist 
] 

打印

[{'name': 'a name', 'titles': ['baz', 'foo', 'bar']}] 
+1

哇,那是美麗的,完美的工作。我剛剛進入蟒蛇並沒有意識到這些人的選擇。非常感謝保羅! – bornytm

0

類型的字典是可變的,所以你可以更新每一個快譯通原始列表,使用itertools.chain扁平化列表清單:

l = [{'name': 'a name', 'titles': [['foo','bar'],['foo','baz']]}] 

from itertools import chain 
for d in l: 
    d["titles"] = list(set(chain.from_iterable(d["titles"]))) 

print(l) 

輸出:

[{'titles': ['bar', 'baz', 'foo'], 'name': 'a name'}] 

如果你想保持各個子元件被認爲你可以使用一個OrderedDict刪除受騙者順序:

from itertools import chain 
from collections import OrderedDict 

for d in l: 
    d["titles"] = list(OrderedDict.fromkeys(chain.from_iterable(d["titles"]))) 

print(l) 

輸出:

[{'name': 'a name', 'titles': ['foo', 'bar', 'baz']}]