![](/img/trans.png)
[英]Find tuples in a list of tuples, with consecutive values and turn them into bigger tuples
[英]How to turn Python list to consecutive tuples including edge items?
對於Python列表:
l = list('ABCDEFG')
怎么能把它變成一個連續的N元組列表,邊緣情況不被拋出? 這是N = 3的示例:
A
A B
A B C
B C D
C D E
D E F
E F G
F G
G
我可以接近
for first, second, third in zip(l,l[1:],l[2:]):
print(first, second, third)
但這不包括邊緣情況,不能輕易擴展到其他N. 我可以使用C-looking for
循環來修補它,檢查數組綁定的有效性,但它很快就會成為嵌套if
語句的網絡,我正在尋找更多的Pythonic解決方案。
使用簡單的列表理解:
def f(seq, n):
return [seq[max(i, 0):i + n] for i in range(-n + 1, len(seq))]
這將在給定序列seq
創建大小為n
的滑動窗口,但在序列開始之前開始n - 1
。 max(i, 0)
的目的是禁止負索引,以便每個切片都是非空的。
示例輸出:
>>> f('ABCDEFG', 2)
['A', 'AB', 'BC', 'CD', 'DE', 'EF', 'FG', 'G']
>>> f('ABCDEFG', 3)
['A', 'AB', 'ABC', 'BCD', 'CDE', 'DEF', 'EFG', 'FG', 'G']
您可以使用3個列表推導來生成邊緣情況和N元組,然后只連接列表:
>>> def f(l, n):
... return ([l[:i] for i in range(1, n)] +
... [l[i:i+n] for i in range(len(l) - n + 1)] +
... [l[-i:] for i in range(n-1, 0, -1)])
...
>>> f(list('ABCDEFG'), 3)
[['A'], ['A', 'B'], ['A', 'B', 'C'], ['B', 'C', 'D'], ['C', 'D', 'E'], ['D', 'E', 'F'], ['E', 'F', 'G'], ['F', 'G'], ['G']]
你可以寫在第一步驟 得到的物品從字符串,然后從產生發電機功能itertools.zip_longest
對象:
from itertools import zip_longest
def func(s, N=3):
lst = ['']*N
for i in range(N-1):
lst[i] = s[i]
yield tuple(lst)
yield from zip_longest(*map(lambda x: l[x:], range(N)), fillvalue='')
for i in func('ABCDEFG', 5):
print(*i)
A
A B
A B C
A B C D
A B C D E
B C D E F
C D E F G
D E F G
E F G
F G
G
你可以試試這個:
l = list('ABCDEFG')
n = 3
def edge_cases(l, n):
first = [l[:i+1] for i in range(n-1)]
second = [l[i:i+n-1] for i in range(len(l)-n)]
third = [l[i-n+1:] for i in range(n-1)]
yield from first+second+third
print(list(edge_cases(l, n)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.