Trăn tương đương với số each_slice(count)
của Ruby là gì?
Tôi muốn lấy 2 phần tử từ danh sách cho mỗi lần lặp lại.
Thích cho [1,2,3,4,5,6]
Tôi muốn xử lý 1,2
trong lần lặp đầu tiên sau đó 3,4
rồi 5,6
.
ofcourse có một cách vòng xoay bằng cách sử dụng giá trị chỉ mục. Nhưng có một chức năng trực tiếp hoặc một cách nào đó để làm điều này trực tiếp?Python tương đương với mỗi số_lice của Ruby (đếm)
Trả lời
Có một recipe cho điều này trong các itertools documentation gọi mú:
from itertools import izip_longest
def grouper(n, iterable, fillvalue=None):
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
Sử dụng như thế này:
>>> l = [1,2,3,4,5,6]
>>> for a,b in grouper(2, l):
>>> print a, b
1 2
3 4
5 6
Lưu ý: sử dụng ** zip_longest ** thay vì ** izip_longest ** cho python 3. – bwv549
Tương tự như Mark nhưng đổi tên thành 'each_slice' và làm việc cho python 2 và 3 :
try:
from itertools import izip_longest # python 2
except ImportError:
from itertools import zip_longest as izip_longest # python 3
def each_slice(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
Sao chép hành vi each_slice của ruby cho một trai nhỏ ling slice:
def each_slice(size, iterable):
""" Chunks the iterable into size elements at a time, each yielded as a list.
Example:
for chunk in each_slice(2, [1,2,3,4,5]):
print(chunk)
# output:
[1, 2]
[3, 4]
[5]
"""
current_slice = []
for item in iterable:
current_slice.append(item)
if len(current_slice) >= size:
yield current_slice
current_slice = []
if current_slice:
yield current_slice
Câu trả lời ở trên sẽ liệt kê danh sách cuối cùng (ví dụ: [5, None]), có thể không phải là điều mong muốn trong một số trường hợp.
Cải thiện trên hai đầu tiên: Nếu có thể chia cắt được lặp lại không chính xác chia hết cho n, giá trị cuối cùng sẽ được điền vào độ dài n bằng Không. Nếu điều này gây ra lỗi cho bạn, bạn có thể thực hiện một thay đổi nhỏ:
def each_slice(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
raw = izip_longest(fillvalue=fillvalue, *args)
return [filter(None, x) for x in raw]
Hãy nhớ rằng điều này sẽ không được sử dụng trong trường hợp Không có lỗi nào gây ra lỗi.
- 1. Python tương đương với 'method_missing' của Ruby '
- 2. Python tương đương với Perl/Ruby || =
- 3. Ruby tương đương với Python cho/else
- 4. Tương đương với chuỗi kiểm tra của ruby () trong python
- 5. Python tương đương với "kiểm tra" của Ruby là gì?
- 6. tương đương với chữ "có" của Ruby trong Ruby
- 7. Ruby tương đương với $ của PHP $
- 8. Tương đương TreeSet của Java tương đương với Python?
- 9. Pygame tương đương với Ruby?
- 10. Python tương đương với Sinatra
- 11. Python tương đương với find2perl
- 12. Ruby tương đương với python setup.py phát triển là gì?
- 13. Python tương đương với phương pháp Ruby Array.each
- 14. Đá quý Ruby LESS tương đương với Python
- 15. Python tương đương với Mclapply của R()
- 16. Java tương đương với struct.pack của Python?
- 17. Python tương đương với IFNULL của MySQL
- 18. Python tương đương với memory_get_usage() của PHP?
- 19. PHP tương đương với biểu tượng Ruby
- 20. python tương đương với sed
- 21. python tương đương tương đương
- 22. Tương đương với Python của các phép nối tiếp với Ruby
- 23. Cụm từ thông dụng của Python có tương đương với nhóm nguyên tử của Ruby không?
- 24. php có tương đương với virtualenv của python hay sandy của ruby không?
- 25. ruby / ray tương đương với javascript decodeURIComponent?
- 26. Tương đương với việc tiêm() bằng Python?
- 27. Tương đương với Array.some trong ruby / rails
- 28. Tương đương với "tiếp tục" trong Ruby
- 29. Ruby file_get_contents tương đương
- 30. metric_fu tương đương với ruby 1.9.x
câu trả lời của nhãn hiệu hoàn toàn đáp ứng các đặc điểm bạn đã cung cấp trong câu hỏi của mình. Tuy nhiên, điều quan trọng cần lưu ý là hành vi mà anh ta chỉ định lệch khỏi each_slice của ruby: Nếu slice cuối cùng ngắn hơn phần còn lại, nó sẽ được đệm với fillvalue, trong khi đó mỗi tệp là một mảng rút gọn. Nếu bạn muốn danh sách rút gọn này/hành vi có thể lặp lại, thì câu trả lời của Mark sẽ không hoạt động. – bwv549