多列表理解

时间:2015-12-02 20:55:50

标签: python

我有以下嵌套列表:

items = [
   [{'URL': '1234', 'ID': 1}, {'URL': '2222', 'ID': 2}],
   [{'URL': '12344321', 'ID': 2}]
]

我如何获得所有网址?

到目前为止,我已经尝试过:

urls = [i['URL'] for i in item for item in items]

3 个答案:

答案 0 :(得分:5)

items = [
   [{'URL': '1234'}, {'ID': 1}],
   [{'URL': '12344321'}, {'ID': 2}]
]
print [i[0]['URL'] for i in items]

获取密钥URL

的值

如果您可以在单个列表中使用多个词典

print [j['URL'] for i in items for j in i]

答案 1 :(得分:2)

分步思考。首先,你想要展平你的外部名单

[d for lst in items for d in lst]
# same order as if you wrote it out in a `for` loop
# for lst in items:
#     for d in lst:
#         yield d

这将为您提供所有词典的单一列表。然后,您希望将值与每个词典中的键"URL"绑定。您知道可以使用[key]语法执行此操作,因此只需在列表comp。

中执行此操作
[d["URL"] for lst in items for d in lst]

如果其中一些词典可能没有"URL"键,那么您可以在末尾应用过滤器

[d["URL"] for lst in items for d in lst if "URL" in d]

答案 2 :(得分:1)

如果你喜欢功能:

items = [
   [{'URL': '1234', 'ID': 1}, {'URL': '2222', 'ID': 2}],
   [{'URL': '12344321', 'ID': 2}]
]

from operator import itemgetter 
from itertools import chain

print(list(map(itemgetter("URL"), chain.from_iterable(items))))
['1234', '2222', '12344321']

chain.from_iterable(items)相当于使用for for循环展平列表列表,map(itemgetter("URL")只从每个dicts中提取每个URL值。

你自己的代码失败只是因为你的逻辑向后,主要的可迭代的首先出现然后每个子列表上的for,否则你试图迭代尚未定义的东西给你{{1 }}:

NameError