从lis中选择相邻的夫妇(或三人组等)

2024-03-29 07:56:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以利用列表索引。。。你知道吗

lst =[1,2,3,4,5,6]
[ [lst[i] , lst[i+1]] for i in range( len(lst) - 1 )]

或:

lst =[1,2,3,4,5,6]
for i in range(len(lst)-1): 
    entities.append([lst[i],lst[i+1]])

但是有更聪明的方法吗?也许用迭代器?表现如何?你知道吗


Tags: 方法in利用列表forlenrangeentities
3条回答

对于一般的解决方案(因为您要求成对、三元组等),请使用^{}

from itertools import tee

def adjacent_tuples(iterable, n=2):
    iterators = tee(iterable, n)
    for i, iterator in enumerate(iterators):
        for j in range(i):
            next(iterator)
    return zip(*iterators)

这将使用最少的内存,并适用于任意长度的元组:

>>> list(adjacent_tuples(range(8), 4))
[(0, 1, 2, 3), (1, 2, 3, 4), (2, 3, 4, 5), (3, 4, 5, 6), (4, 5, 6, 7)]

您在这里得到了一些聪明的答案,但我想建议,最明显的方法就是使用内置的切片索引。像这样:

def gen_k_slices(seq, k):
    for i in range(len(seq) - k + 1):
        yield seq[i:i+k]

下面是一个小试驾:

TEST = [1, 2, 3, 4, 5, 6]
for k in range(8):
    print("k={} -> {}".format(k, list(gen_k_slices(TEST, k))))

及其输出:

k=0 -> [[], [], [], [], [], [], []]
k=1 -> [[1], [2], [3], [4], [5], [6]]
k=2 -> [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]
k=3 -> [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
k=4 -> [[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]
k=5 -> [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6]]
k=6 -> [[1, 2, 3, 4, 5, 6]]
k=7 -> []

我也不喜欢k=0的结果;-)

您可以使用zip()

>>> lst = [1,2,3,4,5,6]

>>> list(zip(lst[:-1],lst[1:]))
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]

>>> list(zip(lst[:-2],lst[1:-1],lst[2:]))
[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)]

相关问题 更多 >