def partition(n, iterable):
p = izip_longest(*([iter(iterable)] * n))
r = []
for x in p:
print(x) #I added this
s = set(x)
s.discard(None)
r.append(list(s))
return r
Điều này thực sự là trong một công việc đăng trên SO và là một newbie tôi nghĩ rằng nó là thú vị. Vì vậy, bạn sẽ có được kết quả như sau:Chức năng này hoạt động như thế nào? (Trình biến đổi Python)
partition(5, L)
(1, 2, 3, 4, None)
Out[86]: [[1, 2, 3, 4]]
Đối với tôi đây là đã nhầm lẫn bởi vì tôi nghĩ izip_longest(*([iter(iterable)] * n))
sẽ chạy izip_longest
chức năng trên một danh sách n lặp giống hệt nhau vì vậy tôi sẽ có dự kiến đầu tiên công suất (1,1,1,1,1)
và sau đó một đầu ra của (2,2,2,2,2)
và cứ thế.
phiên bản Vì vậy, ngắn gọn câu hỏi của tôi, là những gì đang xảy ra với dòng này:
p = izip_longest(*([iter(iterable)] * n))
Phân tích nó tôi đã có thể nghĩ [iter (iterable)] * n tạo ra một danh sách dài n của iterables giống hệt tất cả chỉ vào cùng một thứ - đó là những gì nó làm trên dòng lệnh, nhưng điều đó dường như không phải là những gì nó làm ở đây dựa trên đầu ra được in ở trên.
Ngoài ra tôi nghĩ rằng * ở đầu ...longest(*...
đã ở đó vì danh sách có độ dài không xác định nhưng tôi không nghĩ điều đó hoàn toàn hợp lý. Biểu tượng *
đầu tiên thực hiện bên trong cuộc gọi hàm là gì? Có vẻ như nó chỉ đơn giản là chỉ ra một danh sách dài các đối số không xác định ...
Vì vậy, vào cuối ngày, tôi hoàn toàn bị mất. Ai đó có thể hướng dẫn tôi qua cú pháp này?
Cảm ơn rất nhiều về mọi đầu vào!
Cảm ơn tất cả các câu trả lời hữu ích, tất cả mọi người. Tôi không chắc liệu tôi có trả lời hay câu hỏi ở đây hay không, nhưng dường như tôi hiểu danh sách này sẽ làm điều tương tự cho các danh sách và bộ dữ liệu (tôi nhận ra các trình vòng lặp cũng sẽ áp dụng cho các từ điển, các lớp tùy chỉnh, các thứ khác .. .)
[L[i*n:(i+1)*n] for i in range(int(ceil(len(L)/float(n)))) ]
Bạn đã đọc [Làm thế nào để 'zip (* [iter (s)] * n)' hoạt động trong Python] (http://stackoverflow.com/questions/2233204/how- does-zipitersn-work-in-python)? –
nó phá vỡ một danh sách lớn thành N danh sách nhỏ hơn .... điền Không có trong trường hợp độ dài danh sách không chia hết cho N ... danh sách con duy nhất có chứa bất kỳ 'None' nào là danh sách cuối –
Thêm 'print (list (p))' để xem những gì 'izip_longest()' đã làm. – martineau