Специальный тип комбинации с использованием itertools - PullRequest
0 голосов
/ 17 августа 2010

Я почти закончил задачу, которую мне кто-то дал, которая сначала включала простое использование функции product () из itertools.Тем не менее, человек спросил, что он должен сделать что-то немного другое, например:

li =

[[1, 2, 3],
[4, 5, 6]]

Обычный продукт () будет давать что-то вроде: [1, 4], [1, 5], [1, 6], [2, 4], [2,5], [2, 6], [3, 4] ...

Что нужно сделать:

Сделать обычный продукт (), затем , добавить следующий элемент из первогоэлемент в списке и так далее.Полный набор примеров:

[[1, 4, 2]
[1, 4, 3],
[1, 5, 2],
[1,5, 3],
[2, 4, 3],
[2, 5, 3],
[2, 6, 3]]

Как использовать itertools вэто обстоятельство?

РЕДАКТИРОВАТЬ:

Это может помочь, если я объясню цель программы: пользователь будет вводить, например, список чисел столбца 5 на 6.
Обычный продукт () приведет к комбинации из 5 чисел.Человек хочет комбинацию из 6 номеров.Откуда этот «шестой» номер?Это будет зависеть от его выбора, какой ряд он хочет.

Ответы [ 2 ]

1 голос
/ 18 августа 2010

Обобщено для более чем двух подсписков (другой альтернативой будет функция карты)

from pprint import pprint
for li in ([[1, 2, 3],
            [4, 5, 6]],

           [[1,  2,  3,  4],
            [5,  6,  7,  8],
            [9, 10, 11, 12]]
           ):
    triples= []
    prevlist=li[0]
    for nextlist in li[1:]:
        for spacing in range(1,len(prevlist)):
            triples.extend([[first,other,second]
                            for first,second in zip(prevlist,prevlist[spacing:])
                            for other in nextlist])

    pprint(sorted(triples))
1 голос
/ 18 августа 2010

Мне интересно, какие магические вычисления вы выполняете, но похоже, что это ваша формула:

k = int(raw_input('From What row items should be appeared again at the end?'))
res = [l for l in product(*(li+[li[k]])) if l[k]<l[len(li)] ]
...