Python比较列表中的元素与前一个和下一个

时间:2014-03-20 16:00:23

标签: python

在列表中,我想摆脱与前一个和下一个不同的元素(例如:差异大于5)

n=[1913, 2048, 2049, 2050, 2052, 2052, 2054, 2055]
[x for x,y in zip(n,n[1:]) if  y-x<5]

它几乎可以工作:它返回:[2048, 2049, 2050, 2052, 2052, 2054]

重点是省略了最后一个元素。

是否有快速有效的方式获取[2048, 2049, 2050, 2052, 2052, 2054, 2055] 提前致谢 DOM

2 个答案:

答案 0 :(得分:2)

zip通常可以工作,直到最小的可迭代用尽。这就是为什么忽略你的最后一个值。我们可以使用itertools.izip_longest来修复此问题,如果最短的可迭代用尽,则默认返回None

如果xyNoney or x,我们会将from itertools import izip_longest as ex_zip n = [1913, 2048, 2049, 2050, 2052, 2052, 2054, 2055] print [x for x, y in ex_zip(n,n[1:]) if (y or x) - x < 5] # [2048, 2049, 2050, 2052, 2052, 2054, 2055] 本身的值视为。

{{1}}

答案 1 :(得分:2)

你可以通过在切片上添加一些内容来确保添加最后一个元素。

n=[1913, 2048, 2049, 2050, 2052, 2052, 2054, 2055]
>>> [x for x,y in zip(n,n[1:]+[n[-1]]) if y-x<5]
[2048, 2049, 2050, 2052, 2052, 2054, 2055]

当然,使用itertools.izip代替zip可以提升性能。我将我的方法与thefourtheye进行了比较,并将izip与他们接近:

>>> timeit.repeat(
        stmt="[x for x,y in zip(n,n[1:]+[n[-1]]) if y-x<5]",
        setup="n=[1913, 2048, 2049, 2050, 2052, 2052, 2054, 2055]")
[5.881312771296912, 5.983433510327245, 5.889796803416459]
>>> timeit.repeat(
         stmt="[x for x,y in izip(n,n[1:]+[n[-1]]) if y-x<5]",
         setup="from itertools import izip; n=[1913, 2048, 2049, 2050, 2052, 2052, 2054, 2055]")
[4.871789328236275, 4.895227617064933, 4.80257417537436]
>>> timeit.repeat(
         stmt="[x for x, y in ex_zip(n,n[1:]) if (y or x) - x < 5]",
         setup="from itertools import izip_longest as ex_zip; n=[1913, 2048, 2049, 2050, 2052, 2052, 2054, 2055]")
[4.3260582542764245, 4.375828323146993, 4.177447625285289]