2013-11-14 28 views
1

我想在列表列表中找到一条记录,在这种情况下是3并且获取它们元素[2]的减法元素与元素[2]从先前的记录在子列表中找到一个值,然后用它们的元素值减去以前的元素值

mylist = [ 
["acc", 2, 3.1,4.3,"pe"], 
["fir", 1, 3.5,5.2,"p1"], 
["sec", 3, 1.1,5.8,"pe"], 
["set", 5, 6.2,6,2,"pa"], 
["eve", 8, 5.4,5.7,"io"], 
["ewa", 3, 4.1,4.1,"po"] 
] 

结果应该是:

3.5 - 1.1和5.2 - 5.8
5.4 - 4.1和5.7 - 4.1


我可以通过这段代码得到它,但我想学习一些更好更简单的方法,谢谢。

i=0  
while i<len(mylist)-1: 
     if mylist[i][1] == 3: 
      print mylist[i-1][2]-mylist[i][2] 
      print mylist[i-1][3]-mylist[i][3] 
     i+=1 
+1

'[[“foo”,3,1,1,“foo”]]'打破了你的方法。 – beerbajay

回答

0

简短的回答

for previous, current in zip(mylist[:-1], mylist[1:]): 
    if current[1] == 3: 
     print previous[2] - current[2] 
     print previous[3] - current[3] 

龙答案

我”什么m做的是压缩没有第一个元素和没有最后一个列表的列表:

>>> z = [10, 20, 30, 40, 50] 
>>> z[:-1] 
[10, 20, 30, 40] 
>>> z[1:] 
[20, 30, 40, 50] 
>>> zip(z[:-1], z[1:]) 
[(10, 20), (20, 30), (30, 40), (40, 50)] 

通过遍历压缩列表,我们可以依次访问前一个和当前项目,这通过我在for循环中给出变量的名称来清楚。

请注意,我的解决方案正确处理列表中有零个或一个项目的情况。当发生这种情况时,压缩列表是空的,所以for循环什么都不做。

1

而不是使用while循环,您可以使用for循环。

for row1, row2 in zip(mylist[1:], mylist[0:-1]): 
    if row1[1] == 3: 
     print [y - x for x, y in zip(row1[2:4], row2[2:4])] 

您还可以通过利用izip方法,而不是zip方法节省一些内存。

from itertools import izip 

for row1, row2 in izip(mylist[1:], mylist[0:-1]): 
    if row1[1] == 3: 
     print [y - x for x, y in izip(row1[2:4], row2[2:4])] 

这些代码段将输出

[2.4, -0.6] 
[1.3, 1.6] 

izip()使用generators,而不是名单。这可能会提高脚本的性能,并会节省您的内存。

如果您更喜欢上述代码的较短版本,则可以使用列表解析。

from itertools import izip 
print [[y - x for x, y in izip(row1[2:4], row2[2:4])] for row1, row2 in izip(mylist[1:], mylist[:-1]) if row1[1] == 3] 

输出:

[[2.4, -0.6], [1.3, 1.6]] 

你也可以将上述

for val in ([y - x for x, y in zip(row1[2:4], row2[2:4])] for row1, row2 in zip(mylist[1:], mylist[:-1]) if row1[1] == 3): 
    print val 

输出的发电机:

[2.4, -0.6] 
[1.3, 1.6] 

请记住,通过这样做,发电机在你访问完第一个时候用尽e最后一项,因此如果需要存储输出的值,则不应使用此生成器。

0

可以为您节省预选赛指数掉使用一台发电机,使用发电机在后续步骤中,像这样

gen = (x for x, y in enumerate(mylist) if y[1] == 3) 
[(mylist[x-1][2] - mylist[x][2], mylist[x-1][3] - mylist[x][3]) for x in gen] 
[(2.4, -0.5999999999999996), (1.3000000000000007, 1.6000000000000005)] 
相关问题