Python itertools - PullRequest
       7

Python itertools

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

У меня 4 списка с разным количеством элементов.Я хотел бы вывести все возможные комбинации из 3 элементов отдельных элементов списка.Один из подходов - itertool.combination (), но с .combination я могу комбинировать только элементы в списке.

Списки:

colors      = ["blue", "yellow", "green", "black", "magenta"]
numbers     = [1,2,3,4,5,6,7,8]
material = ["beton", "wood", "stone"]
names      = ["Susi", "Klara", "Claire", "Moni"]

Результат должен быть:

[blue, 1, beton], [blue, 1, Susi], [blue, 2, beton]…

Ответы [ 4 ]

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

Это сработало бы, выдав 436 комбинаций:

import itertools as itls

colors      = ["blue", "yellow", "green", "black", "magenta"]
numbers     = [1,2,3,4,5,6,7,8]
material    = ["beton", "wood", "stone"]
names       = ["Susi", "Klara", "Claire", "Moni"]

my_lists    = [colors, numbers, material, names]

my_combos = [(x,y,z) for (lst_1,lst_2,lst_3) in itls.combinations(my_lists,3) 
                             for (x,y,z) in itls.product(lst_1, lst_2, lst_3) ]

# print (my_combos)
print (len(my_combos))

Объяснение:

Требуемый результат создается в виде списка и присваивается my_combos.

Список строится с использованием понимания списка с вложенной двойной итерацией.

В двойной вложенной итерации:

  1. Внешний цикл for for (lst_1,lst_2,lst_3) in itls.combinations(my_lists,3) повторяетсядля всех возможных комбинаций списков, принимая 3 списка одновременно.
  2. Внутренний цикл for for (x,y,z) in itls.product(lst_1, lst_2, lst_3) выполняет итерацию по декартовому произведению lst_1, lst_2 и lst_3 (эти lst_1, lst_2 и lst_3 определяются для каждой итерации внешнего цикла for)

Код для проверки отсутствия дубликатов в результате:

# Code to verify that there are no duplicates.
from collections import Counter
for x, count_x in counts.items():
    if (count_x > 1): # if duplicate
        print ("Duplicate item ({}) occurs {} times".format(x, count_x))
0 голосов
/ 22 февраля 2019

Вы можете использовать функцию product():

from itertools import product

list(product(colors, numbers, material + names))
0 голосов
/ 22 февраля 2019

Для объединения элементов из разных списков необходимо itertools.product, а для выбора 3 списков из набора из четырех списков - itertools.combinations.

Я предоставляю упрощенный , Сокращенный Пример применения этих двух инструментов ниже:

In [57]: from itertools import product, combinations                                      

In [58]: a, b, c = ['stone','concrete'], ['Jane','Mary'], [1,2,3]                         

In [59]: for l1, l2 in combinations((a,b,c), 2): 
    ...:     for i1, i2 in product(l1,l2): 
    ...:         print(i1, i2)                                                            
stone Jane
stone Mary
concrete Jane
concrete Mary
stone 1
stone 2
stone 3
concrete 1
concrete 2
concrete 3
Jane 1
Jane 2
Jane 3
Mary 1
Mary 2
Mary 3

In [60]:                                                                                  
0 голосов
/ 22 февраля 2019

Используйте product и chain имена и материал:

from itertools import chain, product

colors      = ["blue", "yellow", "green", "black", "magenta"]
numbers     = [1,2,3,4,5,6,7,8]
material = ["beton", "wood", "stone"]
names      = ["Susi", "Klara", "Claire", "Moni"]

out = product(colors, numbers, chain(material, names))

Часть вывода:

for i in range(10):
    print(next(out))

('blue', 1, 'beton')
('blue', 1, 'wood')
('blue', 1, 'stone')
('blue', 1, 'Susi')
('blue', 1, 'Klara')
('blue', 1, 'Claire')
('blue', 1, 'Moni')
('blue', 2, 'beton')
('blue', 2, 'wood')
('blue', 2, 'stone')
...