Отдельные списки формата M = [(a, x), (b, y)] на M1 = [a, b] и M2 = [x, y] - PullRequest
1 голос
/ 27 декабря 2011

У меня есть список M ниже, полученный из внешнего файла (в действительности это большой список, len(M)>10000).

M = [(1, 100), (2, 200), (3, 300), (4, 400)]

Однако я хочуразделите его на M1=[1,2,3,4] и M2=[100,200,300,400].Вот как я это делаю в данный момент:

M1 = [] 
M2 = [] 
for M1,M2 in M:
  M1.append(M1) 
  M2.append(M2)

Мне было интересно, есть ли более простой и эффективный способ сделать это, решение, которое использует встроенные функции вPython.

Ответы [ 3 ]

6 голосов
/ 27 декабря 2011

Просто сделайте это:

M1, M2 = zip(*M)

M1 и M2 будут кортежами.Вы можете преобразовать их в списки, если хотите:

M1, M2 = map(list, zip(*M))

или с помощью genxp:

M1, M2 = (list(i) for i in zip(*M))
2 голосов
/ 27 декабря 2011

Одно решение, более эффективное, чем ваше, поскольку оно использует неявные циклы:

>>> [m1 for m1, _ in M]
>>> [1, 2, 3, 4]
>>> [m2 for _, m2 in M]
>>> [100, 200, 300, 400]

Но лучше использовать оператор * и zip:

>>> M1, M2 = zip(*M)
>>> M1
(1, 2, 3, 4)
>>> M2
(100, 200, 300, 400)
1 голос
/ 27 декабря 2011

Вы можете сделать

M1, M2 = zip(*M)

Это работает как для кортежей, так и для списков.

Если у вас действительно длинный внешний файл, ваша первоначальная версия может быть быстрее, так как этот подходотправит 10 000 аргументов в zip и, следовательно, сохранит все содержимое в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...