我有一个像这样的字典
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'])
您能帮我指出我的嵌套列表理解有什么问题吗?
答案 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'}