2014-01-23 3 views
1

у меня есть 3 списков, как это:алгоритм Python, чтобы последовательно генерировать все возможные результаты слот-автомата

reel1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

reel2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

reel3 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

Мне нужна функция генератора, которая может последовательно дать мне эти:

Первый вывод:

[ 
    [1,2,3] 
    [1,2,3] 
    [1,2,3] 
] 

Второй выход:

[ 
    [1,2,3] 
    [1,2,3] 
    [2,3,4] # Sequentially go through the list 
] 

...

девятым выход:

[ 
    [1,2,3] 
    [2,3,4] # Next block of 3 of the second list 
    [1,2,3] 
] 

Всю дорогу:

[ 
    [8,9,10] # Last block of 3 of the first list 
    [8,9,10] # Last block of 3 of the second list 
    [8,9,10] # Last block of 3 of the third list 
] 

Что такое эффективный алгоритм для достижения выше?

Мой текущий метод: я использую 3 для циклов для последовательного прохождения всех 3 списков, но я не думаю, что он эффективен. Кроме того, если у меня будет более 3 списков, мне придется отступать много.

Благодарим за помощь!

ответ

3
>>> from itertools import product 
>>> reel = list(range(1, 11)) 
>>> for i in product(zip(reel, reel[1:], reel[2:]), repeat=3): 
...  print(i) 

Для обработки обволакивающего упоминается в комментариях, вы можете использовать

>>> for i in product(zip(*(reel[j:]+reel[:j] for j in range(3))), repeat=3): 
...  print(i) 
+0

Я думаю, что это не хватает случаев с запахом '(9, 10, 1) и' (10, 1, 2) '(хотя об этом не задавали в вопросе) –

+0

OP, похоже, не хочет этого. –

+0

Согласен, что не задано явно, но OP заявила, что это игровой автомат с барабанами, кажется разумным заключить –

0
for i in itertools.product([[1,2,3,4,5,6,7,8,9,10][i:i+3] for i in range(0,8)], repeat=3): 
    print(i) 
Смежные вопросы