Hướng dẫn python iterate from middle of list - python lặp lại từ giữa danh sách

Thực sự không chắc chắn nơi này phù hợp. Nói rằng, tôi có một danh sách:

>>>a = [1, 2, 3, 4, 5, 6, 7]

Làm thế nào tôi có thể lặp lại nó theo cách như vậy, rằng nó sẽ kiểm tra 4 trước, sau đó 5, sau đó 3, sau đó 6, và sau đó là 2 (v.v. cho các danh sách lớn hơn)? Tôi chỉ mới có thể làm việc ở giữa đó là

>>>middle = [len(a)/2 if len(a) % 2 = 0 else ((len(a)+1)/2)]

Tôi thực sự không chắc chắn làm thế nào để áp dụng điều này, tôi cũng không chắc chắn rằng cách làm việc ở giữa là cách tốt nhất. Tôi đã nghĩ đến việc lấy hai chỉ mục và sau mỗi lần lặp, thêm 1 và trừ 1 từ mỗi chỉ mục tương ứng nhưng không biết làm thế nào để tạo ra một vòng lặp theo các quy tắc này.

Liên quan đến lý do tại sao tôi cần điều này; Đó là để phân tích một trò chơi hợp lệ trong một trò chơi bài và sẽ kiểm tra từ thẻ giữa của một bàn tay nhất định cho đến mỗi đầu cho đến khi có thể chơi thẻ hợp lệ.

Khi được hỏi ngày 22 tháng 5 năm 2015 lúc 12:24May 22, 2015 at 12:24

Hướng dẫn python iterate from middle of list - python lặp lại từ giữa danh sách

7

Bạn chỉ có thể tiếp tục loại bỏ từ giữa danh sách:

lst = range(1, 8)
while lst:
    print lst.pop(len(lst)/2)

Đây không phải là giải pháp tốt nhất hiệu suất khôn ngoan (loại bỏ mục khỏi danh sách là đắt tiền), nhưng nó rất đơn giản - đủ tốt cho một trò chơi đơn giản.

EDIT:

Giải pháp ổn định hiệu suất hơn sẽ là một trình tạo, tính toán vị trí phần tử:

def iter_from_middle(lst):
    try:
        middle = len(lst)/2
        yield lst[middle]

        for shift in range(1, middle+1):
            # order is important!
            yield lst[middle - shift]
            yield lst[middle + shift]

    except IndexError: # occures on lst[len(lst)] or for empty list
        raise StopIteration

Đã trả lời ngày 22 tháng 5 năm 2015 lúc 12:31May 22, 2015 at 12:31

m.wasowskim.wasowskim.wasowski

6.1791 Huy hiệu vàng21 Huy hiệu bạc 30 Huy hiệu Đồng1 gold badge21 silver badges30 bronze badges

8

Để bắt đầu, đây là một tiện ích mục đích chung rất hữu ích để xen kẽ hai chuỗi:

def imerge(a, b):
    for i, j in itertools.izip_longest(a,b):
        yield i
        if j is not None:
            yield j

Với điều đó, bạn chỉ cần

>>>middle = [len(a)/2 if len(a) % 2 = 0 else ((len(a)+1)/2)]
1

a[len(a) / 2: ]

with

reversed(a[: len(a) / 2])

Đã trả lời ngày 22 tháng 5 năm 2015 lúc 12:29May 22, 2015 at 12:29

Hướng dẫn python iterate from middle of list - python lặp lại từ giữa danh sách

Ami Tavoryami TavoryAmi Tavory

72.7K10 Huy hiệu vàng137 Huy hiệu bạc173 Huy hiệu đồng10 gold badges137 silver badges173 bronze badges

3

Bạn cũng có thể chơi các trò chơi chỉ mục, ví dụ:

>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> [a[(len(a) + (~i, i)[i%2]) // 2] for i in range(len(a))]
[4, 5, 3, 6, 2, 7, 1]

>>> a = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [a[(len(a) + (~i, i)[i%2]) // 2] for i in range(len(a))]
[4, 5, 3, 6, 2, 7, 1, 8]

Đã trả lời ngày 22 tháng 5 năm 2015 lúc 13:28May 22, 2015 at 13:28

Stefan Pochmannstefan PochmannStefan Pochmann

26.5k8 Huy hiệu vàng43 Huy hiệu bạc104 Huy hiệu đồng8 gold badges43 silver badges104 bronze badges

5

Dưới đây là một trình tạo mang lại các chỉ mục xen kẽ cho bất kỳ độ dài được cung cấp nào. Nó có thể được cải thiện/ngắn hơn, nhưng nó hoạt động.

def backNforth(length):
    if length == 0:
        return
    else:
        middle = length//2
        yield middle

        for ind in range(1, middle + 1):
            if length > (2 * ind - 1):
                yield middle - ind
            if length > (2 * ind):
                yield middle + ind 

# for testing:
if __name__ == '__main__':
    r = range(9)
    for _ in backNforth(len(r)):
        print(r[_])

Sử dụng điều đó, bạn chỉ có thể làm điều này để tạo danh sách các mục theo thứ tự bạn muốn:

a = [1, 2, 3, 4, 5, 6, 7]
a_prime = [a[_] for _ in backNforth(len(a))]

Đã trả lời ngày 22 tháng 5 năm 2015 lúc 13:49May 22, 2015 at 13:49

Hướng dẫn python iterate from middle of list - python lặp lại từ giữa danh sách

RickrickRick

40.7K15 Huy hiệu vàng67 Huy hiệu bạc116 Huy hiệu đồng15 gold badges67 silver badges116 bronze badges

Ngoài các yếu tố giữa, tôi cũng cần chỉ số của họ. Tôi đã tìm thấy câu trả lời của Wasowski rất hữu ích và đã sửa đổi nó:I needed their index as well. I found Wasowski's answer very helpful, and modified it:

>>>middle = [len(a)/2 if len(a) % 2 = 0 else ((len(a)+1)/2)]
0

Đã trả lời ngày 2 tháng 1 năm 2020 lúc 5:54Jan 2, 2020 at 5:54

Hướng dẫn python iterate from middle of list - python lặp lại từ giữa danh sách