Продукты набора в Python

Продуктом n копий набора S является обозначенный Sn. Например, {0, 1} 3 набор всех 3 - последовательности битов:

{0,1} 3 = {(0,0,0), (0,0,1), (0,1,0), (0,1,1), (1,0,0), (1,0,1), (1,1,0), (1,1,1)}

Что самый простой путь состоит в том, чтобы копировать эту идею в Python?

8
задан Eugene 17 July 2010 в 14:43
поделиться

4 ответа

В Python 2.6 и новее вы можете использовать itertools.product с необязательным аргументом repeat:

>>> from itertools import product
>>> s1 = set((0, 1))
>>> set(product(s1, repeat = 3))

Для более старых версий Python вы можете реализовать product, используя код, найденный в документации:

def product(*args, **kwds):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
    pools = map(tuple, args) * kwds.get('repeat', 1)
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)
13
ответ дан 5 December 2019 в 11:22
поделиться

Полагаю, это работает?

>>> s1 = set((0,1))
>>> set(itertools.product(s1,s1,s1))
set([(0, 1, 1), (1, 1, 0), (1, 0, 0), (0, 0, 1), (1, 0, 1), (0, 0, 0), (0, 1, 0), (1, 1, 1)])
1
ответ дан 5 December 2019 в 11:22
поделиться

Марк, хорошая идея.

>>> def set_product(the_set, n):
    return set(itertools.product(the_set, repeat=n))

>>> s2 = set((0,1,2))
>>> set_product(s2, 3)
set([(0, 1, 1), (0, 1, 2), (1, 0, 1), (0, 2, 1), (2, 2, 0), (0, 2, 0), (0, 2, 2), (1, 0, 0), (2, 0, 1), (1, 2, 0), (2, 0, 0), (1, 2, 1), (0, 0, 2), (2, 2, 2), (1, 2, 2), (2, 0, 2), (0, 0, 1), (0, 0, 0), (2, 1, 2), (1, 1, 1), (0, 1, 0), (1, 1, 0), (2, 1, 0), (2, 2, 1), (2, 1, 1), (1, 1, 2), (1, 0, 2)])

Можно также расширить тип set и заставить метод __pow__ делать это.

1
ответ дан 5 December 2019 в 11:22
поделиться
print 'You can do like this with generator:'
print set((a,b,c) for a in s1 for b in s1 for c in s1)
0
ответ дан 5 December 2019 в 11:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: