2015-05-20 10 views

Trả lời

17
A = [1,2,3] 
B = [4,5,6] 
C = [b_item for a_item, b_item in zip(A,B) for _ in range(a_item)] 
print C 

Kết quả:

[4, 5, 5, 6, 6, 6] 

này là một trong những dòng tương đương với:

C = [] 
for a_item, b_item in zip(A,B): 
    for _ in range(a_item): 
     C.append(b_item) 

... Đó là tương đương với

C = [] 
for i in range(min(len(A), len(B))): 
    a_item = A[i] 
    b_item = B[i] 
    for _ in range(a_item): 
     C.append(b_item) 

(N.B. Đừng bị vấp ngã bởi dấu gạch dưới. It's an ordinary variable. Người ta thông thường được sử dụng khi bạn không thực sự phải tham khảo giá trị của biến, như trong ví dụ này)

+1

Ông có thể giải thích điều này cho .. người nghiêng ít pythonic như tôi? Tôi đã suy nghĩ 2 cho vòng lol –

+0

@ SterlingArcher, chắc chắn. Theo một cách nào đó, tôi _am_ sử dụng hai cho vòng lặp. Tôi chỉ nhét cả hai người vào một biểu hiện. – Kevin

+0

Cảm ơn. Nhưng như Sterling Archer đã nói .... có logic đơn giản nào để làm điều này không? Mặc dù, điều này hoạt động. – sparrow

2

Giải pháp của tôi:

C = sum([[B[i]]*A[i] for i in range(len(A))], []) 
print C 

Giải thích:

[B[i]]*A[i] sẽ tạo ra một danh sách với A[i] hạng mục công B[i]

[B[i]]*A[i] for i in range(len(A))] sẽ cung cấp cho bạn một danh sách liệt kê, ví dụ như [[4], [5, 5], [6, 6, 6]]

sum(C, []) sẽ chuyển đổi danh sách liệt kê vào danh sách

+1

Vâng, công trình này. 'sum (sequence, [])' là một bộ nhớ kém hiệu quả vì nó phải tạo ra nhiều danh sách trung gian, nhưng đó không phải là một vấn đề lớn nếu C là nhỏ. – Kevin

6

tôi sẽ cung cấp một cách khác để làm việc đó, sử dụng một ý tưởng khác nhau (không tuyên bố ông nên sử dụng điều này, nhưng vì lý do giáo khoa)

tôi thấy khá gọn gàng để được có khả năng tái tạo các yếu tố trong python sử dụng

[0]*3 # it means we create 3 elements of zero: [0,0,0] 

nếu tôi chỉ đơn giản là làm điều này:

[[x]*i for i,x in zip(A, B)] 

tôi nhận được nhóm yếu tố:

[[4], [5, 5], [6, 6, 6]] 

Sau đó, chúng ta có thể sử dụng itertools.chain để có được trở lại với một danh sách duy nhất:

from itertools import chain 
list(chain(*[[x]*i for i,x in zip(A, B)])) 
[4, 5, 5, 6, 6, 6] 
1

Một cách khác:

C = [] 
for a, b in zip(A, B): 
    C.extend([b] * a) 

Nhưng tôi muốn danh sách hiểu, chỉ nếu không có sự gây phiền nhiễu _item, ví dụ:,

C = [b for a, b in zip(A, B) for _ in range(a)] 

Hoặc ngắn hơn (nhưng đối với trường hợp lớn chậm) tổng:

C = sum(([b] * a for a, b in zip(A, B)), []) 
Các vấn đề liên quan