【发布时间】:2017-07-01 07:31:01
【问题描述】:
我遇到了以下有趣的结构:
假设您有如下列表:
my_list = [['captain1', 'foo1', 'bar1', 'foobar1'], ['captain2', 'foo2', 'bar2', 'foobar2'], ...]
并且你想用0-index 元素作为键创建一个字典。一个方便的方法是:
my_dict = {x.pop(0): x for x in my_list}
# {'captain1': ['foo1', 'bar1', 'foobar1'], ...}
看起来,pop 在分配列表 x 作为值之前,这就是为什么 'captain' 没有出现在值中(它已经弹出)
现在让我们更进一步,尝试得到如下结构:
# {'captain1': {'column1': 'foo1', 'column2': 'bar1', 'column3': 'foobar1'}, ...}
对于这个任务,我写了以下内容:
my_headers = ['column1', 'column2', 'column3']
my_dict = {x.pop(0): {k: v for k, v in zip(my_headers, x)} for x in my_list}
但这会返回:
# {'captain1': {'col3': 'bar1', 'col1': 'captain1', 'col2': 'foo1'}, 'captain2': {'col3': 'bar2', 'col1': 'captain2', 'col2': 'foo2'}}
所以在这种情况下,pop 发生在构造内部字典之后(或至少在 zip 之后)。
怎么可能?这是如何工作的?
问题不在于如何去做,而在于为什么会出现这种行为。
我使用的是 Python 版本 3.5.1。
【问题讨论】:
-
我认为这是因为值首先得到评估。
-
@Kasramvd 你有什么支持这个说法的吗?
-
@skyking 据我所知,这就是理解的工作方式。在这种情况下,它会首先评估嵌套的理解。
-
@skyking 似乎即使对于非理解值也是如此。试试
{x.pop(0): x.pop(0) for x in [[1, 2]]}。但请注意,当您从中弹出的列表是预定义列表等内部对象时,它不会像这样执行。 -
请避免将不属于问题的材料放在问题上。问题应仅包含问题和重现问题所需的信息,与解决问题相关的任何内容都属于答案或 cmets。不要把答案的“摘要”放在问题上:那属于答案(如果答案的作者认为合适的话)。
标签: python python-3.x dictionary