Python 多重列表理解

Python 多重列表理解,python,Python,我有以下嵌套列表: items = [ [{'URL': '1234', 'ID': 1}, {'URL': '2222', 'ID': 2}], [{'URL': '12344321', 'ID': 2}] ] 我如何在这里获取所有URL 到目前为止,我已经尝试: urls = [i['URL'] for i in item for item in items] 获取键URL的值 如果您可以在一个列表中使用多个词典 print [j['URL'] for i in items

我有以下嵌套列表:

items = [
   [{'URL': '1234', 'ID': 1}, {'URL': '2222', 'ID': 2}],
   [{'URL': '12344321', 'ID': 2}]
]
我如何在这里获取所有URL

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

urls = [i['URL'] for i in item for item in items]
获取键URL的值

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

print [j['URL'] for i in items for j in i]
获取键URL的值

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

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

如果您喜欢功能性:

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']
from_iterableitems相当于使用双for循环展平列表列表,mapitemgetterURL只是从每个dict中提取每个URL值

您自己的代码之所以失败,是因为您的逻辑是反向的,首先是主iterable上的for,然后是每个子列表上的for,否则您试图对尚未定义的内容进行迭代,从而导致NameError:


如果您喜欢功能性:

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']
from_iterableitems相当于使用双for循环展平列表列表,mapitemgetterURL只是从每个dict中提取每个URL值

您自己的代码之所以失败,是因为您的逻辑是反向的,首先是主iterable上的for,然后是每个子列表上的for,否则您试图对尚未定义的内容进行迭代,从而导致NameError:


分步思考。首先,您希望将外部列表展平

[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]

分步思考。首先,您希望将外部列表展平

[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]

[d['URL']表示i中的i,如果d中的'URL'表示i中的d]如果您不知道该词典的位置is@David542哦,看,我的评论回答了这个问题。@David542使用print[j['URL']代表i中的j项中的i]或者filterNone[d.get'URL'代表d项中的d项]哎呀,我没有看到@AdamSmith的评论。答案已删除。除了变量名,我不知道这两个解决方案是如何相同的。[d['URL']表示项目中的I,d表示项目中的d,如果'URL'表示项目中的d],如果您不知道字典在哪里的话is@David542哦,看,我的评论回答了这个问题。@David542在项目中使用print[j['URL']表示i,在项目中使用j,在项目中使用j,或者可能使用filterNone[d.get'URL'表示项目中的项目,在项目中使用d]Oops,我没有看到@AdamSmith的评论。答案已删除。除了变量名之外,我不知道这两个解决方案是如何相同的。相关:相关:我一直认为我应该在这里使用operator.itemgetter!然后我写了一个lambda。@AdamSmith,我更喜欢itemgetter,效率更高,我总是在找借口使用它!除非我已经是导入操作员,尝试ggO,导入操作员,^O比lambda x:x['URL']更难:啊,匿名向下投票,向下投票以获得正确答案,做得好;我一直在想我应该在这里使用operator.itemgetter!然后我写了一个lambda。@AdamSmith,我更喜欢itemgetter,效率更高,我总是在找借口使用它!除非我已经是导入操作员,尝试ggO,导入操作员,^O比lambda x:x['URL']更难:啊,匿名向下投票,向下投票以获得正确答案,做得好;