Как использовать списочное понимание, чтобы равняться нескольким переменным в python? - PullRequest
0 голосов
/ 13 февраля 2019

Предположим, у меня есть следующий элемент

_example = namedtuple('example',['x','y'])

, и я собираю несколько примеров, подобных этому

examples = magic_function_that_returns_a_list_of_examples()

Я хочу заменить следующие 2 строки

xs = [ e.x for e in examples]
ys = [ e.y for e in examples]

к чему-то вроде этого ...

xs,ys  = [ [e.x,e.y] for e in examples]

Чтобы выразить это словами, можно ли использовать списочное понимание для установки двух переменных одновременно?

1 Ответ

0 голосов
/ 13 февраля 2019

Вы можете просто транспонировать список namedtuple s и распаковать его:

xs, ys = zip(*examples)

Например:

from collections import namedtuple

example = namedtuple('example',['x','y'])
examples = [example(i, j) for i in range(5) for j in range(5)]

xs, ys = zip(*examples)
print(xs)
print(ys)

Вывод:

(0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4)
(0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4)

Любые решения с использованием списочных представлений излишне запутаны, и их лучше заменить двумя приведенными вами списками.Если вы хотите сделать это в одной строке, самый понятный и наиболее читаемый способ с использованием списков - это

xs, ys = [e.x for e in examples], [e.y for e in examples]

Однако, на мой взгляд, zip(*examples), вероятно, еще лучше.

...