在做了一些网页抓取并结合结果之后,我留下了一个字典列表。其中一个键(标题)是一个列表列表。
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
似乎匹配永远不会等于标题中的值。我试过改变循环的嵌套但到目前为止无济于事。我在某个地方迷路了,我不知道还有什么可以尝试的。非常感谢任何建议。
答案 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']}]