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
4

3 回答 3

1

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

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()使用生成器而不是列表。这可能会提高您的脚本的性能,并会节省您的内存。

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

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]

请记住,这样做会在您访问最后一个项目后耗尽生成器,因此如果您需要存储输出的值,则不应为此使用生成器。

于 2013-11-14T15:48:48.280 回答
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)]
于 2013-11-14T15:59:49.583 回答
0

简短的回答

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

长答案

我正在做的是压缩没有第一个元素的列表和没有最后一个元素的列表:

>>> 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 循环什么也不做。

于 2013-11-14T16:06:21.817 回答