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

似乎 match 永远不会等于 title 中的值。我试过改变循环的嵌套,但到目前为止无济于事。我在某个地方迷路了,我不确定还能尝试什么。任何意见是极大的赞赏。

4

2 回答 2

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']}]
于 2013-11-03T22:12:40.003 回答
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'}]

如果您想保持看到每个子元素的顺序,您可以使用 anOrderedDict来删除重复项:

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']}]
于 2015-11-28T17:23:20.143 回答