练习-帮助调试嵌套列表理解

时间:2018-09-11 12:48:38

标签: python for-loop list-comprehension

我有一个像这样的字典

output = {'all_paths': [{'path': [{'to': '59v4aQo015zRyeGZ', 'proximity': 6, 'from': '4Po9aW3oxoNaAQzW'}], 'weight': 6}, {'path': [{'to': '59v4aQo015zRyeGZ', 'proximity': 7, 'from': 'AyD8rYemY6er47Vk'}, {'to': 'ZGmDayG795LRojPv', 'proximity': 6, 'from': 'AyD8rYemY6er47Vk'}, {'to': '59v4aQo015zRyeGZ', 'proximity': 6, 'from': '4Po9aW3oxoNaAQzW'}, {'to': 'ZGmDayG795LRojPv', 'proximity': 6, 'from': '4Po9aW3oxoNaAQzW'}, {'to': '59v4aQo015zRyeGZ', 'proximity': 6, 'from': 'eEo7aB0vgkdRO02V'}, {'to': 'ZGmDayG795LRojPv', 'proximity': 4, 'from': 'eEo7aB0vgkdRO02V'}], 'weight': 35}, {'path': [{'to': 'LWbARpjEjpZae3DZ', 'proximity': 4, 'from': '4Po9aW3oxoNaAQzW'}, {'to': '59v4aQo015zRyeGZ', 'proximity': 6, 'from': '4Po9aW3oxoNaAQzW'}], 'weight': 10}, {'path': [{'to': 'ZGmDayG795LRojPv', 'proximity': 6, 'from': '4Po9aW3oxoNaAQzW'}], 'weight': 6}, {'path': [{'to': 'LWbARpjEjpZae3DZ', 'proximity': 4, 'from': '4Po9aW3oxoNaAQzW'}], 'weight': 4}, {'path': [{'to': 'ZGmDayG795LRojPv', 'proximity': 7, 'from': 'LWbARpjEjpZae3DZ'}], 'weight': 7}]}

我想创建两组,一组包含字段“ to”中的所有ID,另一组包含字段“ from”中的所有ID。

为简洁起见,我尝试使用列表理解,但结果出乎意料,仅包含一个主题:

nf = set([edge['from'] for edge in path['path'] for path in output['all_paths']])
# set(['LWbARpjEjpZae3DZ'])

正确的结果将是:

nf = set()
for edge in [path['path'] for path in output['all_paths']]:
    nf.add( edge[0]['from'])
# set(['AyD8rYemY6er47Vk', '4Po9aW3oxoNaAQzW', 'LWbARpjEjpZae3DZ'])

您能帮我指出我的嵌套列表理解有什么问题吗?

2 个答案:

答案 0 :(得分:1)

要详细说明我的观点,解决这些问题的最佳方法是在树上进行迭代搜索

首先,您将看到一个根密钥

<span ng-class= "autoscroll?'first second third':'classes_if_false'"></span>

然后,您可以查看其类型以查看它是否必须重复

In [212]: output.keys()
Out[212]: ['all_paths']

然后,我们可以查看每个列表项中的可用键,以查看In [222]: type(output['all_paths']) Out[222]: list 是键

path, weight

然后查看In [223]: set(tuple(i.keys()) for i in output['all_paths']) Out[223]: {('path', 'weight')} 来查找下一级密钥

path

我们可以增强理解力

In [217]: set(tuple(j.keys()) for i in output['all_paths'] for j in i['path'])
Out[217]: {('to', 'proximity', 'from')}

请注意,我使用In [220]: set(j.get('from') for i in output['all_paths'] for j in i.get('path', [])) Out[220]: {'4Po9aW3oxoNaAQzW', 'AyD8rYemY6er47Vk', 'LWbARpjEjpZae3DZ', 'eEo7aB0vgkdRO02V'} In [221]: set(j.get('to') for i in output['all_paths'] for j in i.get('path', [])) Out[221]: {'59v4aQo015zRyeGZ', 'LWbARpjEjpZae3DZ', 'ZGmDayG795LRojPv'} 表示如果不存在该密钥,则不会中断任何内容,并且不会在i.get('path', [])后面附加任何项目。

更一般地说,请记住,理解是的折叠形式

set

答案 1 :(得分:0)

您可以使用嵌套的理解:

d = {i.get('from', i.get('id')) for b in output['all_paths'] for i in b['path']}

输出:

{'LWbARpjEjpZae3DZ', 'eEo7aB0vgkdRO02V', 'AyD8rYemY6er47Vk', '4Po9aW3oxoNaAQzW'}