在列表中,我想摆脱与前一个和下一个不同的元素(例如:差异大于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
答案 0 :(得分:2)
zip
通常可以工作,直到最小的可迭代用尽。这就是为什么忽略你的最后一个值。我们可以使用itertools.izip_longest
来修复此问题,如果最短的可迭代用尽,则默认返回None
。
如果x
为y
且None
为y 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]