Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取列表元素之间差异的更好解决方案_Python - Fatal编程技术网

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

我不是在寻找一个解决方案(我有两个;),而是在深入了解python的内部结构的基础上,比较每个解决方案的优缺点。谢谢

与同事一起,我们希望为所有元素提取两个连续列表元素之间的差异。因此,对于列表:

[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