2013-08-07 30 views
5
if n == 1: return [(-1,), (1,)] 
if n == 2: return [(-1,0), (1,0), (0,-1), (0,1)] 
if n == 3: return [(-1,0,0), (1,0,0), (0,-1,0), (0,1,0), (0,0,-1), (0,0,1)] 

Về cơ bản, hãy trả lại danh sách 2n bộ dữ liệu phù hợp với đặc điểm kỹ thuật ở trên. Đoạn mã trên hoạt động tốt cho mục đích của tôi nhưng tôi muốn thấy một hàm hoạt động cho tất cả n ∈ ℕ (chỉ để chỉnh sửa). Bao gồm cả tuple([0]*n) trong câu trả lời là chấp nhận được bởi tôi.Cách tạo ra loại danh sách này là gì? (Khuôn mặt của hình chữ nhật n)

Tôi đang sử dụng tính năng này để tạo hướng của khuôn mặt cho thước đo polytope. Đối với tất cả các hướng, tôi có thể sử dụng list(itertools.product(*[(0, -1, 1)]*n)), nhưng tôi không thể đưa ra một cái gì đó khá ngắn gọn cho chỉ hướng khuôn mặt.

+2

tôi có lẽ muốn ngừng suy nghĩ về nó và sử dụng một 'vòng for'. – user2357112

+2

Ehm .. * "Code Golf không còn là chủ đề cho Stack Overflow" *. – arshajii

+0

@arshajii: đó không phải là sân gôn. Như bạn có thể thấy, câu trả lời bình chọn hàng đầu không phải là sân gôn. – rhombidodecahedron

Trả lời

5
def faces(n): 
    def iter_faces(): 
     f = [0] * n 
     for i in range(n): 
      for x in (-1, 1): 
       f[i] = x 
       yield tuple(f) 
      f[i] = 0 
    return list(iter_faces()) 

>>> faces(1) 
[(-1,), (1,)] 
>>> faces(2) 
[(-1, 0), (1, 0), (0, -1), (0, 1)] 
>>> faces(3) 
[(-1, 0, 0), (1, 0, 0), (0, -1, 0), (0, 1, 0), (0, 0, -1), (0, 0, 1)] 
2
>>> set(itertools.permutations([1] + [0]*(n-1))) | set(itertools.permutations([-1] + [0]*(n-1))) 
+2

Thời gian chạy tối đa làm cho điều này trở thành một ý tưởng tồi. Ngoài ra, các tuple kết quả có một '0' quá nhiều. – user2357112

+1

Sửa lỗi 'n'. Câu trả lời rõ ràng là không phù hợp với 'n' lớn, nhưng tôi sẽ bỏ nó lại. – roippi

3
[tuple(sign * (i == p) for i in range(n)) for p in range(n) for sign in (-1, 1)] 

Plain for, không tiềm ẩn boolint tương đương:

for p in range(n): 
    for sign in (-1, 1): 
     yield tuple((sign if i == p else 0) for i in range(n)) 
+3

Một lớp lót, nhưng phải mất một chút để tìm ra, và 3 'cho' mệnh đề là một chút nhiều. – user2357112

3

Cách tôi nhìn thấy vấn đề này là hai i đồng thời nterleaving n thay đổi kích thước đăng ký

>>> def shift_register(n): 
    l1 = (-1,) + (0,)*(n - 1) 
    l2 = (1,) + (0,)*(n - 1) 
    while any(l1): 
     yield l1 
     yield l2 
     l1 = (0,) + l1[:-1] 
     l2 = (0,) + l2[:-1] 


>>> list(shift_register(3)) 
[(-1, 0, 0), (1, 0, 0), (0, -1, 0), (0, 1, 0), (0, 0, -1), (0, 0, 1)] 
3

Một giải pháp sử dụng numpy:

>>> a = numpy.identity(3, dtype=int) 
>>> numpy.hstack((a, -a)).reshape(6, 3) 
array([[ 1, 0, 0], 
     [-1, 0, 0], 
     [ 0, 1, 0], 
     [ 0, -1, 0], 
     [ 0, 0, 1], 
     [ 0, 0, -1]]) 
Các vấn đề liên quan