2011-05-29 182 views
2

如何将一个元素与排序列表中的下一个元素进行比较,并列出其差异。任何帮助,将不胜感激。比较列表元素

Eg: 
lst = [3.18,10.57,14.95,...] 
10.57 - 3.18 = 7.39 
14.95 - 10.57 = 4.38 
... 
+0

请发表您写下的代码;并请使用作业标签。 – 2011-05-29 00:51:53

+0

也许不相关,但我发现这个帖子是最有帮助的:http://stackoverflow.com/questions/942543/operation-on-every-pair-of-element-in-a-list – Hassek 2014-05-22 17:56:45

回答

6

如果你操纵的数值数据,可以考虑使用numpy的

import numpy as np 

lst = [3.18,10.57,14.95] 
arr = np.array(lst) 

diff = np.diff(arr) 

>>> diff 
array([ 7.39, 4.38]) 

你可以将其转换回目录,如果你有:

diff_list = list(diff) 

否则,你可以迭代它只是像你遍历一个列表:

for item in diff: 
    print(item) 

7.39 
4.38 

编辑:五大解决方案,我计时是相当接近对方,所以选择一个更易于阅读

t = timeit.Timer("[b - a for a, b in zip(l, l[1:])]", "l = range(int(1e6))") 
print(t.timeit(1)) 
>>> 0.523894071579 

t = timeit.Timer("list(np.diff(np.array(l)))", "import numpy as np; l = range(int(1e6))") 
print(t.timeit(1)) 
>>> 0.484916915894 

t = timeit.Timer("diffs = [l[x + 1] - l[x] for x in range(len(l) - 1)]", "l = range(int(1e6))") 
print(t.timeit(1)) 
>>> 0.363043069839 

t = timeit.Timer("[(x, y, y - x) for (x, y) in itertools.izip(l, it)]", "l = range(int(1e6)); it = iter(l); it.next()") 
print(t.timeit(1)) 
>>> 0.54354596138 

# pairwise solution 
t = timeit.Timer("a, b = itertools.tee(l); next(b, None); [(x, y) for x, y in itertools.izip(a, b)]", "l = range(int(1e6));") 
print(t.timeit(1)) 
>>> 0.477301120758 
+1

如果您已经在使用numpy,那么您最好使用numpy.diff,它完全符合DGT的要求 - 无需创建原始列表的其他副本。 – 2011-05-29 01:24:39

+0

@Jim Brissom谢谢 – 2011-05-29 01:38:36

3
diffs = [lst[x + 1] - lst[x] for x in range(len(lst) - 1)] 
for x in diffs: 
    print x 
6
it = iter(lst) 
it.next() 
print [(x, y, y - x) for (x, y) in itertools.izip(lst, it)] 
+1

Hooray随机downvotes。 – 2011-05-29 00:56:20

+3

我不喜欢参加“同情upvote”的趋势,但有一个。这个答案没有错。 – 2011-05-29 00:57:40

3

使用zip和邮政编码,与本身的列表。

l = [1, 2, 4, 7] 
[b - a for a, b in zip(l, l[1:])] 

# [1, 2, 3] 
+0

请注意,这将创建'l'(少于它的第一个元素)的副本,然后(在Python中<3)创建包含'l'所有元素以及其副本所有元素的另一个*列表。您应该更喜欢基于iter的解决方案(例如[我的](http://stackoverflow.com/questions/6165277/compare-list-elements/6165319#6165319)或[Ignacio的](http:// stackoverflow。 com/questions/6165277/compare-list-elements/6165291#6165291)),特别是如果你的'list'很大! – Johnsyweb 2011-05-29 01:29:38

4

您需要pairwise()recipeitertools,从那里很多Python的善良来。

>>> for x,y in pairwise(lst): 
...  print(y, " - ", x, " = ", y - x) 
... 
10.57 - 3.18 = 7.390000000000001 
14.95 - 10.57 = 4.379999999999999 
+1

+1,'pairwise'很甜蜜,如果和'grouper'一起使它成为iterools,它会很整洁...... – Skurmedel 2011-05-29 01:04:21