有没有办法在嵌套字典理解中使用临时列表变量?
Is there a way to use temporary list variable inside nested dict comprehension?
这是我的字典的样子:
ranked_imgs = {'d57b26aa-c8f8-4e08-9e8f-8aecd6e952a5': {'small': [],
'medium': [['https://www.pablo-ruiz-picasso.net/images/works/261.jpg', 1]],
'large': []},
'b10ecfdb-f590-4930-9975-aa12dc267f2f': {'small': [],
'medium': [],
'large': [['https://www.pablo-ruiz-picasso.net/images/works/3936.jpg', 1]]},......}
这就是我尝试使用字典理解来做的事情,但它失败了,因为临时列表因 for 循环而被覆盖:
dct = {k:[x for x in vv] for k,v in ranked_imgs.items() for vk,vv in v.items()}
或者类似这样的东西:
dct = {k:sum(vv,[]) for k,v in ranked_imgs.items() for vk,vv in v.items()}
这就是代码在理解后的样子:
# ranked_imgs_={}
# for k,v in ranked_imgs.items():
# lst = []
# for vk,vv in v.items():
# for url in vv:
# lst.append(url)
# ranked_imgs_[k] = lst
我很想知道是否有 pythonic 方式使用字典理解来做到这一点!
您的预期输出是列表字典,因此您可以使用列表理解作为字典理解的输出值。另请注意,您可以迭代 v.values()
而不是 v.items()
因为您没有使用键(感谢@MechanicPig 指出):
dct = {k: [url for vv in v.values() for url in vv] for k, v in ranked_imgs.items()}
使用chain.from_iterable
可能比@blhsing的答案好一点,它通过连接v.values()
:
来迭代
from itertools import chain
result = {k: list(chain.from_iterable(v.values())) for k, v in ranked_imgs.items()}
这是我的字典的样子:
ranked_imgs = {'d57b26aa-c8f8-4e08-9e8f-8aecd6e952a5': {'small': [],
'medium': [['https://www.pablo-ruiz-picasso.net/images/works/261.jpg', 1]],
'large': []},
'b10ecfdb-f590-4930-9975-aa12dc267f2f': {'small': [],
'medium': [],
'large': [['https://www.pablo-ruiz-picasso.net/images/works/3936.jpg', 1]]},......}
这就是我尝试使用字典理解来做的事情,但它失败了,因为临时列表因 for 循环而被覆盖:
dct = {k:[x for x in vv] for k,v in ranked_imgs.items() for vk,vv in v.items()}
或者类似这样的东西:
dct = {k:sum(vv,[]) for k,v in ranked_imgs.items() for vk,vv in v.items()}
这就是代码在理解后的样子:
# ranked_imgs_={}
# for k,v in ranked_imgs.items():
# lst = []
# for vk,vv in v.items():
# for url in vv:
# lst.append(url)
# ranked_imgs_[k] = lst
我很想知道是否有 pythonic 方式使用字典理解来做到这一点!
您的预期输出是列表字典,因此您可以使用列表理解作为字典理解的输出值。另请注意,您可以迭代 v.values()
而不是 v.items()
因为您没有使用键(感谢@MechanicPig 指出):
dct = {k: [url for vv in v.values() for url in vv] for k, v in ranked_imgs.items()}
使用chain.from_iterable
可能比@blhsing的答案好一点,它通过连接v.values()
:
from itertools import chain
result = {k: list(chain.from_iterable(v.values())) for k, v in ranked_imgs.items()}