2014-11-15 17 views
7

Điều tôi đang cố gắng thực hiện khá đơn giản, nhưng tôi không thể tìm thấy cách thực hiện.Cách tách danh sách Python mọi thành phần Nth

  • Bắt đầu với phần tử thứ nhất, đặt mọi phần tử thứ 4 vào danh sách mới.
  • Lặp lại với các yếu tố thứ 2, thứ 3 và thứ 4.

Từ:

list = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b'] 

Để:

list1 = ['1', '5', '9'] 
list2 = ['2', '6', 'a'] 
list3 = ['3', '7', 'b'] 
list4 = ['4', '9'] 

Nói cách khác, tôi cần phải biết làm thế nào để:

  • Lấy yếu tố thứ N từ một danh sách (trong vòng lặp)
  • Lưu trữ trong mảng mới
  • Lặp lại
+1

Đừng tạo ra biến mới. Lưu trữ danh sách của bạn trong danh sách mẹ thay thế. –

Trả lời

13

Các giải pháp cụ thể là sử dụng cắt với một sải chân:

source = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b'] 
list1 = source[::4] 
list2 = source[1::4] 
list3 = source[2::4] 
list4 = source[3::4] 

source[::4] tận dụng mọi yếu tố thứ 4, bắt đầu từ chỉ số 0; các lát khác chỉ thay đổi chỉ mục bắt đầu.

Giải pháp chung là sử dụng vòng lặp để thực hiện việc cắt và lưu kết quả vào danh sách ngoài; một danh sách hiểu biết có thể làm điều đó độc đáo:

def slice_per(source, step): 
    return [source[i::step] for i in range(step)] 

Demo:

>>> source = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b'] 
>>> source[::4] 
['1', '5', '9'] 
>>> source[1::4] 
['2', '6', 'a'] 
>>> def slice_per(source, step): 
...  return [source[i::step] for i in range(step)] 
... 
>>> slice_per(source, 4) 
[['1', '5', '9'], ['2', '6', 'a'], ['3', '7', 'b'], ['4', '8']] 
>>> slice_per(source, 3) 
[['1', '4', '7', 'a'], ['2', '5', '8', 'b'], ['3', '6', '9']] 
+0

Tại sao không biến nó thành máy phát điện? Nó sẽ xử lý các trường hợp vô hạn quá sau đó. –

+0

@ EdgarKlerks: Bạn sẽ phải tạo các biến lặp 'n'' islice' rồi. –

+0

@EdgarKlerks: điều đó có nghĩa là bạn sẽ phải loại bỏ dữ liệu đầu vào có thể lặp lại, và điều đó có khả năng trở nên rất tốn kém, trí nhớ khôn ngoan. –

2

Các tên được đánh số là một ý tưởng tồi, và bạn không nên đặt tên của riêng bạn biến list (nó bóng tối built-in), nhưng nói chung bạn có thể làm một cái gì đó như:

>>> startlist = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b'] 
>>> n = 4 
>>> endlist = [[] for _ in range(n)] 
>>> for index, item in enumerate(startlist): 
    endlist[index % n].append(item) 


>>> endlist 
[['1', '5', '9'], ['2', '6', 'a'], ['3', '7', 'b'], ['4', '8']] 
Các vấn đề liên quan