Python 获取列表元素之间差异的更好解决方案
我不是在寻找一个解决方案(我有两个;),而是在深入了解python的内部结构的基础上,比较每个解决方案的优缺点。谢谢强> 与同事一起,我们希望为所有元素提取两个连续列表元素之间的差异。因此,对于列表:Python 获取列表元素之间差异的更好解决方案,python,Python,我不是在寻找一个解决方案(我有两个;),而是在深入了解python的内部结构的基础上,比较每个解决方案的优缺点。谢谢 与同事一起,我们希望为所有元素提取两个连续列表元素之间的差异。因此,对于列表: [1,2,4] 预期产出为: [1,2] (因为2-1=1,4-2=2) 我们有两种解决方案,我不确定它们之间的比较。第一个是非常类似C的,它将列表视为一个表,并减去两个连续列表元素之间的差异 res = [] for i in range(0, len(a)-1): res.append
[1,2,4]
预期产出为:
[1,2]
(因为2-1=1,4-2=2)
我们有两种解决方案,我不确定它们之间的比较。第一个是非常类似C的,它将列表视为一个表,并减去两个连续列表元素之间的差异
res = []
for i in range(0, len(a)-1):
res.append(a[i+1] - a[i])
第二个是(对于列表“l”),我认为更像是蟒蛇:
[j - i for i,j in zip(l[:-1], l[1:])]
但是,构建两个列表副本然后提取差异不是效率低很多吗?Python如何在内部处理这个问题
谢谢你的见解 如果我理解了你的问题,我建议你使用这样的方式:
diffList = lambda l: [(l[i] - l[i-1]) for i in range(1, len(l))]
answer = diffList( [ 1,2,4] )
此函数将为您提供一个列表,其中包含输入列表中所有连续元素之间的差异
这一方法与第一种方法类似(但仍有点类似),比第二种方法更有效。没有lambdas:
[l[i+1] - l[i] for i in range(len(l) - 1)]
例如:
如您所见,速度稍快一些(编辑:添加中投票率最高的解决方案):
使用发电机:
def diff_elements(lst):
"""
>>> list(diff_elements([]))
[]
>>> list(diff_elements([1]))
[]
>>> list(diff_elements([1, 2, 4, 7]))
[1, 2, 3]
"""
as_iter = iter(lst)
last = next(as_iter)
for value in as_iter:
yield value - last
last = value
这具有以下特性:
您应该发布这两种解决方案,它们将更易于比较。如果您不想构建列表副本,请使用
itertools.izip
和itertools.islice
@sounddefence:确实,谢谢。我已经编辑了我的帖子。这些列表是否足够大,足以关注性能?只需编写最可读的版本和可维护的版本。注意:您可以通过使用l
而不是l[:-1]
轻松提高第二个解决方案的性能<当最短输入完成时,code>zip已经终止,因此您必须删除最后一个元素。
>>> import timeit
>>>
>>> s = """\
... l = [1, 4, 7, 15, 16]
... [l[i+1] - l[i] for i in range(len(l) - 1)]
... """
>>> r = """\
... l = [1, 4, 7, 15, 16]
... [j - i for i,j in zip(l[:-1], l[1:])]
... """
>>> t = """\
... l = [1, 4, 7, 15, 16]
... [j-i for i, j in itertools.izip(l[:-1], l[1:])]
... """
>>> timeit.timeit(stmt=s, number=100000)
0.09615588188171387
>>> timeit.timeit(stmt=s, number=100000)
0.09774398803710938
>>> timeit.timeit(stmt=s, number=100000)
0.09683513641357422
#-------------
>>> timeit.timeit(stmt=r, number=100000)
0.14137601852416992
>>> timeit.timeit(stmt=r, number=100000)
0.12511301040649414
>>> timeit.timeit(stmt=r, number=100000)
0.12285017967224121
#-------------
>>> timeit.timeit(stmt=t, number=100000)
0.11506795883178711
>>> timeit.timeit(stmt=t, number=100000)
0.11677718162536621
>>> timeit.timeit(stmt=t, number=100000)
0.11829996109008789
def diff_elements(lst):
"""
>>> list(diff_elements([]))
[]
>>> list(diff_elements([1]))
[]
>>> list(diff_elements([1, 2, 4, 7]))
[1, 2, 3]
"""
as_iter = iter(lst)
last = next(as_iter)
for value in as_iter:
yield value - last
last = value