2013-11-03 2 views
1

일부 웹 스크래핑을 수행하고 결과를 결합한 후 사전 목록이 남아 있습니다. 하나의 키 (제목)는 목록의 목록입니다.목록/Dict 데이터 조작 - 중복 삭제

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))

던져이며, 우리는 당신이 바로 업데이트 할 수 있도록

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

각 하위 요소는 당신이 속는을 제거 할 OrderedDict을 사용할 수 있습니다 보였다 순서를 유지하고 싶었다면

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

와우, 아름답고 완벽하게 작동했습니다. 나는 파이썬에 들어가기 만하고 옵션이 있다는 것을 깨닫지 못했다. 폴 감사합니다. – bornytm

0

dicts을 변경할 수 있습니다

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 
] 

인쇄물을 얻을 각 목록은 원래 목록에 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) 

출력 :

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']}]