Hướng dẫn python get consecutive pairs from list - python lấy các cặp liên tiếp từ danh sách

Đưa ra một danh sách

l = [1, 7, 3, 5]

Tôi muốn lặp lại tất cả các cặp mục danh sách liên tiếp

for x, y in someiterator(l): ...
0, tức là

for i in xrange(len(l) - 1):
    x = l[i]
    y = l[i + 1]
    # do something

Tôi muốn làm điều này một cách nhỏ gọn hơn, như

for x, y in someiterator(l): ...

Có cách nào để làm điều này bằng cách sử dụng các trình lặp python tích hợp không? Tôi chắc chắn mô -đun

for x, y in someiterator(l): ...
1 nên có một giải pháp, nhưng tôi không thể tìm ra nó.

Hướng dẫn python get consecutive pairs from list - python lấy các cặp liên tiếp từ danh sách

ndmeiri

4.91812 Huy hiệu vàng34 Huy hiệu bạc43 Huy hiệu Đồng12 gold badges34 silver badges43 bronze badges

Đã hỏi ngày 23 tháng 1 năm 2014 lúc 8:42Jan 23, 2014 at 8:42

1

Chỉ cần sử dụng zip

>>> l = [1, 7, 3, 5]
>>> for first, second in zip(l, l[1:]):
...     print first, second
...
1 7
7 3
3 5

Nếu bạn sử dụng Python 2 (không được đề xuất), bạn có thể cân nhắc sử dụng hàm

for x, y in someiterator(l): ...
2 trong
for x, y in someiterator(l): ...
1 cho các danh sách rất dài mà bạn không muốn tạo danh sách mới.

import itertools

for first, second in itertools.izip(l, l[1:]):
    ...

Đã trả lời ngày 23 tháng 1 năm 2014 lúc 8:45Jan 23, 2014 at 8:45

Hướng dẫn python get consecutive pairs from list - python lấy các cặp liên tiếp từ danh sách

Sberrysberrysberry

125K18 Huy hiệu vàng136 Huy hiệu bạc165 Huy hiệu Đồng18 gold badges136 silver badges165 bronze badges

8

Nhìn vào

for x, y in someiterator(l): ...
4 tại các công thức nấu ăn của Itertools: http://docs.python.org/2/l Library/itertools.html#recipes

Trích dẫn từ đó:

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

Một phiên bản chung

Một phiên bản chung, mang lại các bộ dữ liệu của bất kỳ kích thước tự nhiên tích cực nhất định nào, có thể trông như thế:

def nwise(iterable, n=2):                                                      
    iters = tee(iterable, n)                                                     
    for i, it in enumerate(iters):                                               
        next(islice(it, i, i), None)                                               
    return izip(*iters)   

Đã trả lời ngày 23 tháng 1 năm 2014 lúc 8:46Jan 23, 2014 at 8:46

BachbachBach

6.0477 Huy hiệu vàng33 Huy hiệu bạc59 Huy hiệu Đồng7 gold badges33 silver badges59 bronze badges

4

Tôi sẽ tạo một máy phát

for x, y in someiterator(l): ...
5 chung, như thế này

def grouper(input_list, n = 2):
    for i in xrange(len(input_list) - (n - 1)):
        yield input_list[i:i+n]

Mẫu chạy 1

for first, second in grouper([1, 7, 3, 5, 6, 8], 2):
    print first, second

Đầu ra

1 7
7 3
3 5
5 6
6 8

Mẫu chạy 1

for i in xrange(len(l) - 1):
    x = l[i]
    y = l[i + 1]
    # do something
0

Đầu ra

for i in xrange(len(l) - 1):
    x = l[i]
    y = l[i + 1]
    # do something
1

Đã trả lời ngày 23 tháng 1 năm 2014 lúc 8:51Jan 23, 2014 at 8:51

Hướng dẫn python get consecutive pairs from list - python lấy các cặp liên tiếp từ danh sách

Thefourtheyethefourtheyethefourtheye

227K52 Huy hiệu vàng443 Huy hiệu bạc486 Huy hiệu Đồng52 gold badges443 silver badges486 bronze badges

1

Tổng quát hóa cách tiếp cận của Sberry đối với sự hiểu biết:

for i in xrange(len(l) - 1):
    x = l[i]
    y = l[i + 1]
    # do something
2

Ví dụ

for i in xrange(len(l) - 1):
    x = l[i]
    y = l[i + 1]
    # do something
3

[(0, 1, 2), (1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, 7), ( 6, 7, 8), (7, 8, 9)]

Đã trả lời ngày 4 tháng 1 năm 2019 lúc 21:12Jan 4, 2019 at 21:12

Một phương tiện đơn giản để làm điều này mà không cần sao chép không cần thiết là một trình tạo lưu trữ phần tử trước đó.

for i in xrange(len(l) - 1):
    x = l[i]
    y = l[i + 1]
    # do something
4

Không giống như các giải pháp dựa trên chỉ số, điều này hoạt động trên bất kỳ sự lặp lại nào, bao gồm các giải pháp không được hỗ trợ (ví dụ: Trình tạo) hoặc chậm (ví dụ:

for x, y in someiterator(l): ...
6).

Đã trả lời ngày 20 tháng 4 năm 2020 lúc 13:00Apr 20, 2020 at 13:00

Hướng dẫn python get consecutive pairs from list - python lấy các cặp liên tiếp từ danh sách

MistermiyagimistermiyagiMisterMiyagi

40.3k10 Huy hiệu vàng95 Huy hiệu bạc107 Huy hiệu đồng10 gold badges95 silver badges107 bronze badges

Bạn có thể sử dụng

for x, y in someiterator(l): ...
7.

for i in xrange(len(l) - 1):
    x = l[i]
    y = l[i + 1]
    # do something
5

Giống như một dây kéo, nó tạo ra các cặp. Vì vậy, để kết hợp hai danh sách của bạn, bạn nhận được:

for i in xrange(len(l) - 1):
    x = l[i]
    y = l[i + 1]
    # do something
6

Sau đó, lặp đi lặp lại như

for i in xrange(len(l) - 1):
    x = l[i]
    y = l[i + 1]
    # do something
7

Đã trả lời ngày 23 tháng 1 năm 2014 lúc 8:48Jan 23, 2014 at 8:48

Hướng dẫn python get consecutive pairs from list - python lấy các cặp liên tiếp từ danh sách

NoctuanoctuaNoctua

4.9561 Huy hiệu vàng17 Huy hiệu bạc22 Huy hiệu đồng1 gold badge17 silver badges22 bronze badges

2

Nếu bạn muốn một cái gì đó nội tuyến nhưng không thể đọc được khủng khiếp thì đây là một giải pháp khác sử dụng máy phát điện. Tôi hy vọng nó cũng không phải là hiệu suất tốt nhất khôn ngoan:-/

Chuyển đổi danh sách thành Trình tạo bằng một tinh chỉnh để kết thúc trước mục cuối cùng:

for i in xrange(len(l) - 1):
    x = l[i]
    y = l[i + 1]
    # do something
8

Chuyển đổi nó thành các cặp:

for i in xrange(len(l) - 1):
    x = l[i]
    y = l[i + 1]
    # do something
9

Đó là tất cả những gì bạn cần.

Đã trả lời ngày 21 tháng 5 năm 2016 lúc 17:06May 21, 2016 at 17:06

Hướng dẫn python get consecutive pairs from list - python lấy các cặp liên tiếp từ danh sách

2