簡體   English   中英

如何將Python列表轉換為包括邊項的連續元組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM