Генератор для выдачи списка - PullRequest
1 голос
/ 23 марта 2012

У меня есть три списка списков, и я пытаюсь написать функцию генератора, чтобы помочь мне упаковать значения в одном индексе.

Итак, мои списки:

list1 = [[1, 2, 3], [2, 3, 4],...]
list2 = [[4, 5, 6], [5, 6, 7],...]
list3 = [[8, 9, 10], [9, 10, 11],...]

Мой желаемый вывод:

result1 = [[1, 4, 8], [2, 5, 9],...]
result2 = [[2, 5, 9], [3, 6, 10],...]
result3 = [[3, 6, 10], [4, 7, 11],...]

Моя попытка:

def bundle(x, y, z, index):
    for row in x, y, z:
        for item in row[index]:
            yield list(item)

Я получаю плавающее неповторяемые ошибки.Если я немного изменю это:

def bundle(x, y, z, index):
    for row in x, y, z:
        for item in row:
            yield item[index]

Я получу значения, которые я хочу, как одну большую последовательность, но я предпочел бы сохранить их сгруппированными во вложенном стиле.

Ответы [ 3 ]

2 голосов
/ 23 марта 2012

Если вы имеете дело с числовыми значениями, вы можете использовать метод транспонирования numpy, чтобы достичь желаемого:

import numpy
numpy.array([list1,list2, list3]).T
2 голосов
/ 23 марта 2012

Если вы имеете дело с большими списками, пользовательский, полностью ленивый подход будет следующим:

import itertools as it

def bundle(lists, index):
  return ([b[index] for b in blocks] for blocks in it.izip(*lists))

print list(bundle([[[1, 2, 3],  [2, 3, 4]], 
                   [[4, 5, 6],  [5, 6, 7]], 
                   [[8, 9, 10], [9, 10, 11]]], 
                  0))
# => [[1, 4, 8], [2, 5, 9]]
2 голосов
/ 23 марта 2012

Одним из способов сделать это является повторное применение zip():

res1, res2, res3 = zip(*(zip(*x) for x in zip(list1, list2, list3)))

. Используется zip(list1, list2, list3) для создания последовательности матриц, zip(*x) для транспонирования каждой из этих матриц иокончательный zip(), чтобы распаковать три результирующих последовательности.(Я не думаю, что этот подход очень эффективен.)

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