如何将Python列表转换为包含边缘项的连续元组?

dkqlctbz  于 2023-04-08  发布在  Python
关注(0)|答案(5)|浏览(111)

对于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)

我可以用一个看起来像C语言的for循环来修补它,检查数组绑定的有效性,但它很快就变成了一个嵌套的if语句的网络,我正在寻找一个更像Python的解决方案。

juud5qan

juud5qan1#

使用一个简单的列表理解:

def f(seq, n):
    return [seq[max(i, 0):i + n] for i in range(-n + 1, len(seq))]

这在给定序列seq上创建了一个大小为n的滑动窗口,但在序列开始之前启动n - 1max(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']
pxy2qtax

pxy2qtax2#

你可以写一个生成器函数,它首先在 steps 中从字符串中 * 产生 * 项,然后从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
drnojrws

drnojrws3#

您可以使用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']]
d4so4syb

d4so4syb4#

你可以试试这个:

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)))
aamkag61

aamkag615#

我问了ChatGPT,这个答案对我很管用

import numpy as np

# create a NumPy array
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])

# specify the size of each tuple
n = 3

# use a list comprehension with slicing to create consecutive tuples
tuples = [tuple(arr[i:i+n]) for i in range(len(arr)-n+1)]

# print the resulting tuples
for t in tuples:
    print(t)

相关问题