2010-07-17 43 views
7

Sản phẩm của n bản sao của bộ S được ký hiệu là S n. Ví dụ, {0, 1} là tập hợp của tất cả các trình tự 3-bit:Đặt sản phẩm bằng Python

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

Cách đơn giản nhất để nhân rộng ý tưởng này bằng Python là gì?

+0

chỉ là {0,1} hoặc nó có thể là gì không? – st0le

+0

Bộ tùy ý sẽ đẹp, cũng như một n tùy ý. – Eugene

Trả lời

10

Trong Python 2.6 hoặc mới hơn, bạn có thể sử dụng itertools.product với đối số tùy chọn repeat:

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

Đối với phiên bản cũ của Python bạn có thể thực hiện product sử dụng mã được tìm thấy trong các tài liệu hướng dẫn:

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) 
1

Tôi cho rằng tính năng này hoạt động?

>>> 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

Đánh dấu, ý tưởng hay.

>>> 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)]) 

Bạn cũng có thể mở rộng các loại hình thiết lập và thực hiện các phương pháp __pow__ làm điều này.

0
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) 
Các vấn đề liên quan