列表/字典数据操作 - 删除重复项

时间:2013-11-03 22:08:54

标签: python list dictionary duplicates

在做了一些网页抓取并结合结果之后,我留下了一个字典列表。其中一个键(标题)是一个列表列表。

 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

似乎匹配永远不会等于标题中的值。我试过改变循环的嵌套但到目前为止无济于事。我在某个地方迷路了,我不知道还有什么可以尝试的。非常感谢任何建议。

2 个答案:

答案 0 :(得分: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 :(得分:0)

dicts是可变的,所以您只需更新原始列表中的每个dict,使用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']}]