Đối với dữ liệu vấn đề của chúng tôi:
x = 11 #no. of elements to get
text = 'string5' #text to search in elements of list
lst = ['string1', 'string2', 'string3', 'string4', 'string5', 'string6', 'string7']
n = len[lst]
# index of required text
i = lst.index[text]
Thuật toán 1: [Chu kỳ & Slice] [Cycle & Slice]
Hầu hết các cách Pythonic là sử dụng các chức năng,
from itertools import cycle, islice
desired = list[ islice[ cycle[ lst], i+1, i+1+x]]
4 và from itertools import cycle, islice
desired = list[ islice[ cycle[ lst], i+1, i+1+x]]
5 từ mô -đun from itertools import cycle, islice
desired = list[ islice[ cycle[ lst], i+1, i+1+x]]
6 OffCourse:- Chu kỳ thông qua / lặp lại danh sách vô hạn [hàm
5]from itertools import cycle, islice desired = list[ islice[ cycle[ lst], i+1, i+1+x]]
- Lát / chọn các phần tử mong muốn bằng các chỉ số bắt đầu / dừng từ danh sách lặp lại [hàm
8]from itertools import cycle, islice desired = list[ islice[ cycle[ lst], i+1, i+1+x]]
Code:
from itertools import cycle, islice
desired = list[ islice[ cycle[ lst], i+1, i+1+x]]
Thuật toán 2: [lập chỉ mục vòng & modulo] [Loop & Modulo Indexing]
Một cách truyền thống hơn sẽ là:
- Vòng lặp qua danh sách
9 không. thời gian bắt đầu sau khi chỉ số phù hợp,from itertools import cycle, islice desired = list[ islice[ cycle[ lst], i+1, i+1+x]]
0desired = [ lst[ j%n] for j in range[i+1, i+1+x]]
- Chu kỳ thông qua các yếu tố danh sách bằng cách sử dụng lập chỉ mục
1desired = [ lst[ j%n] for j in range[i+1, i+1+x]]
Code:
desired = [ lst[ j%n] for j in range[i+1, i+1+x]]
Thuật toán 3 - Thực hiện xấu: [Xoay & Lặp lại] [Rotate & Repeat]
Nhiều triển khai nghèo/ chậm cũng có thể, ví dụ: Sử dụng các hàm
desired = [ lst[ j%n] for j in range[i+1, i+1+x]]
2, như desired = [ lst[ j%n] for j in range[i+1, i+1+x]]
3, desired = [ lst[ j%n] for j in range[i+1, i+1+x]]
4:- Cuộn/ xoay mảng
2 để khởi động nó với phần tử ở chỉ mục phù hợp,desired = [ lst[ j%n] for j in range[i+1, i+1+x]]
6desired = [ lst[ j%n] for j in range[i+1, i+1+x]]
- Ngói / Lặp lại mảng để tăng chiều dài của nó nhiều hơn so với
9 không. của các yếu tốfrom itertools import cycle, islice desired = list[ islice[ cycle[ lst], i+1, i+1+x]]
- Chọn
9 không. của các yếu tốfrom itertools import cycle, islice desired = list[ islice[ cycle[ lst], i+1, i+1+x]]
Mã số:
def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
Output:
>>> nextx[lst,5,7,11]
['string6', 'string7', 'string1', 'string2', 'string3', 'string4', 'string5', 'string6', 'string7', 'string1', 'string2']
>>> nextx[lst,5,7,11] == [lst[j%len[lst]] for j in range[5,5+11]] == list[islice[cycle[lst],5,5+11]]
True
Timing:
Chức năng ma thuật Ipython Line
desired = [ lst[ j%n] for j in range[i+1, i+1+x]]
9 cho thấy def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
0 không đáng ngạc nhiên def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
1 so với 2 và 3 tương ứng:>>> %timeit list[ islice[ cycle[ lst], 5, 5+11]]
100000 loops, best of 3: 1.83 µs per loop
>>> %timeit [ lst[ j%len[lst]] for j in range[5, 5+11]]
100000 loops, best of 3: 2.76 µs per loop
>>> %timeit nextx[lst,5,7,11]
10000 loops, best of 3: 20.6 µs per loop
Conclusion:
Sử dụng
from itertools import cycle, islice
desired = list[ islice[ cycle[ lst], i+1, i+1+x]]
6 là cách nhanh nhất và nhanh nhất để đi bất cứ khi nào bạn có thể sử dụng from itertools import cycle, islice
desired = list[ islice[ cycle[ lst], i+1, i+1+x]]
5, from itertools import cycle, islice
desired = list[ islice[ cycle[ lst], i+1, i+1+x]]
4, def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
5, def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
6, v.v.! Vòng lặp qua nhiều danh sách
Tín dụng: Andy McKay
Vấn đề
Bạn cần phải lặp qua mọi mục của nhiều danh sách.
Dung dịch
Về cơ bản có ba cách tiếp cận. Nói bạn có:
a = ['a1', 'a2', 'a3'] b = ['b1', 'b2']
Sử dụng chức năng tích hợp
def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
7, với đối số đầu tiên là def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
8, bạn có thể lặp lại trên cả hai danh sách song song:print "Map:" for x, y in map[None, a, b]: print x, y
Các vòng lặp chạy ba lần. Trên lần lặp cuối cùng,
def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
9 sẽ là def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
8.Sử dụng chức năng tích hợp
>>> nextx[lst,5,7,11]
['string6', 'string7', 'string1', 'string2', 'string3', 'string4', 'string5', 'string6', 'string7', 'string1', 'string2']
>>> nextx[lst,5,7,11] == [lst[j%len[lst]] for j in range[5,5+11]] == list[islice[cycle[lst],5,5+11]]
True
1 cũng cho phép bạn lặp lại song song:print "Zip:" for x, y in zip[a, b]: print x, y
Vòng lặp chạy hai lần; Việc lặp thứ ba chỉ đơn giản là không được thực hiện.
Danh sách hiểu biết có một lần lặp rất khác nhau:
print "List comprehension:" for x, y in [[x,y] for x in a for y in b]: print x, y
Vòng lặp chạy sáu lần, trên mỗi mục của
>>> nextx[lst,5,7,11]
['string6', 'string7', 'string1', 'string2', 'string3', 'string4', 'string5', 'string6', 'string7', 'string1', 'string2']
>>> nextx[lst,5,7,11] == [lst[j%len[lst]] for j in range[5,5+11]] == list[islice[cycle[lst],5,5+11]]
True
2 cho mỗi mục của >>> nextx[lst,5,7,11]
['string6', 'string7', 'string1', 'string2', 'string3', 'string4', 'string5', 'string6', 'string7', 'string1', 'string2']
>>> nextx[lst,5,7,11] == [lst[j%len[lst]] for j in range[5,5+11]] == list[islice[cycle[lst],5,5+11]]
True
3.Thảo luận
Sử dụng
def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
7 với def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
8 làm đối số đầu tiên là một biến thể tinh tế của cuộc gọi def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
7 tiêu chuẩn, thường có chức năng là đối số đầu tiên. Như tài liệu chỉ ra, nếu đối số đầu tiên là def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
8, hàm nhận dạng được sử dụng làm hàm mà qua đó các đối số được ánh xạ. Nếu có nhiều đối số danh sách, def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
7 trả về một danh sách bao gồm các bộ dữ liệu có chứa các mục tương ứng từ tất cả các danh sách [nói cách khác, thì đó là một loại hoạt động chuyển vị]. Các đối số danh sách có thể là bất kỳ loại trình tự nào và kết quả luôn là một danh sách.Lưu ý rằng kỹ thuật đầu tiên trả về
def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
8 cho các chuỗi trong đó không có thêm các yếu tố. Do đó, đầu ra của vòng lặp đầu tiên là:from itertools import cycle, islice
desired = list[ islice[ cycle[ lst], i+1, i+1+x]]
0>>> nextx[lst,5,7,11]
['string6', 'string7', 'string1', 'string2', 'string3', 'string4', 'string5', 'string6', 'string7', 'string1', 'string2']
>>> nextx[lst,5,7,11] == [lst[j%len[lst]] for j in range[5,5+11]] == list[islice[cycle[lst],5,5+11]]
True
1 cho phép bạn lặp lại các danh sách theo cách tương tự, nhưng chỉ có số lượng các yếu tố của danh sách nhỏ nhất. Do đó, đầu ra của kỹ thuật thứ hai là:from itertools import cycle, islice
desired = list[ islice[ cycle[ lst], i+1, i+1+x]]
1Python 2.0 đã giới thiệu các toàn bộ danh sách, với một cú pháp mà một số tìm thấy một chút lạ:
from itertools import cycle, islice
desired = list[ islice[ cycle[ lst], i+1, i+1+x]]
2Điều này lặp lại trong danh sách
>>> nextx[lst,5,7,11]
['string6', 'string7', 'string1', 'string2', 'string3', 'string4', 'string5', 'string6', 'string7', 'string1', 'string2']
>>> nextx[lst,5,7,11] == [lst[j%len[lst]] for j in range[5,5+11]] == list[islice[cycle[lst],5,5+11]]
True
2 cho mọi yếu tố trong >>> nextx[lst,5,7,11]
['string6', 'string7', 'string1', 'string2', 'string3', 'string4', 'string5', 'string6', 'string7', 'string1', 'string2']
>>> nextx[lst,5,7,11] == [lst[j%len[lst]] for j in range[5,5+11]] == list[islice[cycle[lst],5,5+11]]
True
3. Các yếu tố này được đưa vào một tuple >>> %timeit list[ islice[ cycle[ lst], 5, 5+11]]
100000 loops, best of 3: 1.83 µs per loop
>>> %timeit [ lst[ j%len[lst]] for j in range[5, 5+11]]
100000 loops, best of 3: 2.76 µs per loop
>>> %timeit nextx[lst,5,7,11]
10000 loops, best of 3: 20.6 µs per loop
3 >>> %timeit list[ islice[ cycle[ lst], 5, 5+11]]
100000 loops, best of 3: 1.83 µs per loop
>>> %timeit [ lst[ j%len[lst]] for j in range[5, 5+11]]
100000 loops, best of 3: 2.76 µs per loop
>>> %timeit nextx[lst,5,7,11]
10000 loops, best of 3: 20.6 µs per loop
4. Sau đó, chúng tôi lặp lại thông qua danh sách kết quả của các bộ dữ liệu trong vòng lặp >>> %timeit list[ islice[ cycle[ lst], 5, 5+11]]
100000 loops, best of 3: 1.83 µs per loop
>>> %timeit [ lst[ j%len[lst]] for j in range[5, 5+11]]
100000 loops, best of 3: 2.76 µs per loop
>>> %timeit nextx[lst,5,7,11]
10000 loops, best of 3: 20.6 µs per loop
5 ngoài cùng. Do đó, đầu ra của kỹ thuật thứ ba khá khác nhau:from itertools import cycle, islice
desired = list[ islice[ cycle[ lst], i+1, i+1+x]]
3Xem thêm
Phần tham chiếu thư viện về các loại trình tự; Tài liệu cho các tích hợp
>>> nextx[lst,5,7,11]
['string6', 'string7', 'string1', 'string2', 'string3', 'string4', 'string5', 'string6', 'string7', 'string1', 'string2']
>>> nextx[lst,5,7,11] == [lst[j%len[lst]] for j in range[5,5+11]] == list[islice[cycle[lst],5,5+11]]
True
1 và def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
7 trong tài liệu tham khảo thư viện.Library Reference section on sequence types; documentation for the >>> nextx[lst,5,7,11]
['string6', 'string7', 'string1', 'string2', 'string3', 'string4', 'string5', 'string6', 'string7', 'string1', 'string2']
>>> nextx[lst,5,7,11] == [lst[j%len[lst]] for j in range[5,5+11]] == list[islice[cycle[lst],5,5+11]]
True
1 and def nextx[lst,i,n,x]:
ll = np.array[lst]
rll = np.roll[ll, n-i]
trll = np.tile[rll, x%n+1]
return list[trll[:x]]
7 built-ins in the Library Reference.