Python 如何复制列表中的项目(保留第一个和最后一个项目),并将列表转换为包含两个项目的列表

Python 如何复制列表中的项目(保留第一个和最后一个项目),并将列表转换为包含两个项目的列表,python,python-3.x,numpy,Python,Python 3.x,Numpy,我有一个列表=[1,2,3,4,5,1],我想复制索引0到-1之间的项 duplicate_list = [1,2,2,3,3,4,4,5,5,1] 然后,将其转换为包含2项的列表 list_lists = [(1,2),(2,3),(3,4),(4,5),(5,1)] 如何操作?使用numpy,您可以列堆栈lst[:-1](删除最后一个元素的原始列表)和lst[1:://code>(删除第一个元素的原始列表): 或普通列表,您可以使用zip: list(zip(lst[:-1], lst

我有一个列表=[1,2,3,4,5,1],我想复制索引0到-1之间的项

duplicate_list = [1,2,2,3,3,4,4,5,5,1]
然后,将其转换为包含2项的列表

list_lists = [(1,2),(2,3),(3,4),(4,5),(5,1)] 

如何操作?

使用
numpy
,您可以
列堆栈
lst[:-1]
(删除最后一个元素的原始列表)和
lst[1:://code>(删除第一个元素的原始列表):

或普通列表,您可以使用
zip

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

使用
numpy
,您可以
column\u stack
lst[:-1]
(删除最后一个元素的原始列表)和
lst[1:][/code>(删除第一个元素的原始列表):

或普通列表,您可以使用
zip

list(zip(lst[:-1], lst[1:]))
# [(1, 2), (2, 3), (3, 4), (4, 5), (5, 1)]
使用以下命令:

temp = [list[0]]
for n in list[1:-1]:
    temp.append(n)
    temp.append(n)
temp.append(list[-1])
final = []
for e, n in enumerate(temp):
    if e != len(temp)-1:
        final.append((temp[e], temp[e+1]))
# final is what you want
使用以下命令:

temp = [list[0]]
for n in list[1:-1]:
    temp.append(n)
    temp.append(n)
temp.append(list[-1])
final = []
for e, n in enumerate(temp):
    if e != len(temp)-1:
        final.append((temp[e], temp[e+1]))
# final is what you want
使用标准zip()

使用标准zip()


可以使用跟踪最后一项的滚动迭代器执行此操作:

def pairs(seq):
    it = iter(seq)
    last = next(it)
    for cur in it:
        yield last, cur
        last = cur
现在,您可以将其用于迭代(
用于成对对(lst)
)或将其转换为列表:

list(pairs(lst))

这样做的好处是,它不会像使用furas的
zip
解决方案那样复制列表。

您可以使用跟踪最后一项的滚动迭代器执行此操作:

def pairs(seq):
    it = iter(seq)
    last = next(it)
    for cur in it:
        yield last, cur
        last = cur
现在,您可以将其用于迭代(
用于成对对(lst)
)或将其转换为列表:

list(pairs(lst))
这样做的好处是,它不会像使用furas的
zip
解决方案那样复制列表。

您可以尝试使用获取重复的项目,然后从该列表中切片
[1:-1]

from itertools import repeat

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

duplicate_list = [x for item in lst for x in repeat(item, 2)][1:-1]

>>> print(duplicate_lst)
[1, 2, 2, 3, 3, 4, 4, 5, 5, 1]
然后只需使用列表理解就可以得到元组列表:

lst_tuples = [tuple(duplicate_list[i:i+2]) for i in range(0, len(duplicate_list), 2)]

>>> print(lst_tuples)
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 1)]
您可以尝试使用获取重复项,然后从该列表中切片
[1:-1]

from itertools import repeat

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

duplicate_list = [x for item in lst for x in repeat(item, 2)][1:-1]

>>> print(duplicate_lst)
[1, 2, 2, 3, 3, 4, 4, 5, 5, 1]
然后只需使用列表理解就可以得到元组列表:

lst_tuples = [tuple(duplicate_list[i:i+2]) for i in range(0, len(duplicate_list), 2)]

>>> print(lst_tuples)
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 1)]

如果您从1d numpy阵列开始,只需要读取访问权限,那么
stride\u tricks
解决方案(例如,请参见)几乎是无与伦比的

否则,@furas'是最自然也是最快的(见下面的基准测试)。只有对于非常大的列表,使用
itertools.islice
可以加快速度,避免复制原始列表。如果我在基准中歪曲了任何一项,请道歉:

# n = 10
# using list
# stride_tricks         0.01128030 ms
# pp                    0.00127090 ms
# furas                 0.00111770 ms
# psidom                0.00730510 ms
# psidom_pp             0.00649300 ms
# kindall               0.00172260 ms
# script8man       apparently failed
# roadrunner            0.00346820 ms
# rr_pp                 0.00182190 ms
# using array
# stride_tricks         0.00890350 ms
# pp                    0.00270040 ms
# furas                 0.00259900 ms
# psidom                0.00391140 ms
# psidom_pp             0.00438800 ms
# kindall               0.00311760 ms
# script8man       apparently failed
# roadrunner            0.00957060 ms
# rr_pp                 0.00293320 ms
# n = 1000
# using list
# stride_tricks         0.05983050 ms
# pp                    0.03760700 ms
# furas                 0.03222870 ms
# psidom                0.11121020 ms
# psidom_pp             0.05617930 ms
# kindall               0.07354290 ms
# script8man       apparently failed
# roadrunner            0.27846060 ms
# rr_pp                 0.10267700 ms
# using array
# stride_tricks         0.00893700 ms
# pp                    0.08859840 ms
# furas                 0.08421750 ms
# psidom                0.00523970 ms
# psidom_pp             0.00569720 ms
# kindall               0.10453420 ms
# script8man       apparently failed
# roadrunner            0.94786410 ms
# rr_pp                 0.22243330 ms
# n = 1000000
# using list
# stride_tricks        52.28693480 ms
# pp                   70.97792920 ms
# furas                82.29811870 ms
# psidom              145.07117650 ms
# psidom_pp            59.57470910 ms
# kindall             107.59983590 ms
# script8man       apparently failed
# roadrunner          325.66514080 ms
# rr_pp               144.23583440 ms
# using array
# stride_tricks         0.01255540 ms
# pp                  143.99962610 ms
# furas               138.27061310 ms
# psidom                7.30384170 ms
# psidom_pp             7.42180100 ms
# kindall             148.59603090 ms
# script8man       apparently failed
# roadrunner         1030.40049850 ms
# rr_pp               260.31780930 ms
代码:


如果您从1d numpy阵列开始,只需要读取访问权限,那么
stride\u tricks
解决方案(例如,请参见)几乎是无与伦比的

否则,@furas'是最自然也是最快的(见下面的基准测试)。只有对于非常大的列表,使用
itertools.islice
可以加快速度,避免复制原始列表。如果我在基准中歪曲了任何一项,请道歉:

# n = 10
# using list
# stride_tricks         0.01128030 ms
# pp                    0.00127090 ms
# furas                 0.00111770 ms
# psidom                0.00730510 ms
# psidom_pp             0.00649300 ms
# kindall               0.00172260 ms
# script8man       apparently failed
# roadrunner            0.00346820 ms
# rr_pp                 0.00182190 ms
# using array
# stride_tricks         0.00890350 ms
# pp                    0.00270040 ms
# furas                 0.00259900 ms
# psidom                0.00391140 ms
# psidom_pp             0.00438800 ms
# kindall               0.00311760 ms
# script8man       apparently failed
# roadrunner            0.00957060 ms
# rr_pp                 0.00293320 ms
# n = 1000
# using list
# stride_tricks         0.05983050 ms
# pp                    0.03760700 ms
# furas                 0.03222870 ms
# psidom                0.11121020 ms
# psidom_pp             0.05617930 ms
# kindall               0.07354290 ms
# script8man       apparently failed
# roadrunner            0.27846060 ms
# rr_pp                 0.10267700 ms
# using array
# stride_tricks         0.00893700 ms
# pp                    0.08859840 ms
# furas                 0.08421750 ms
# psidom                0.00523970 ms
# psidom_pp             0.00569720 ms
# kindall               0.10453420 ms
# script8man       apparently failed
# roadrunner            0.94786410 ms
# rr_pp                 0.22243330 ms
# n = 1000000
# using list
# stride_tricks        52.28693480 ms
# pp                   70.97792920 ms
# furas                82.29811870 ms
# psidom              145.07117650 ms
# psidom_pp            59.57470910 ms
# kindall             107.59983590 ms
# script8man       apparently failed
# roadrunner          325.66514080 ms
# rr_pp               144.23583440 ms
# using array
# stride_tricks         0.01255540 ms
# pp                  143.99962610 ms
# furas               138.27061310 ms
# psidom                7.30384170 ms
# psidom_pp             7.42180100 ms
# kindall             148.59603090 ms
# script8man       apparently failed
# roadrunner         1030.40049850 ms
# rr_pp               260.31780930 ms
代码:


比我的答案好,但我倾向于避免非stl代码比我的答案好,但我倾向于避免非stl代码