Я наткнулся на следующую интересную конструкцию:
при условии, что у вас есть список списков:
my_list = [['captain1', 'foo1', 'bar1', 'foobar1'], ['captain2', 'foo2', 'bar2', 'foobar2'], ...]
и вы хотите создать dict из них с элементами 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.