成对比较列表python中的元素

时间:2016-01-08 12:31:59

标签: python list python-2.7

给出以下列表:

snplist = [[1786, 0.0126525], [2463, 0.0126525], [2907, 0.0126525], [3068, 0.0126525], [3086, 0.0126525], [3398, 0.0126525], [5468,0.012654], [5531,0.0127005], [5564,0.0127005], [5580,0.0127005]]

我想对列表的每个子列表中的第二个元素进行成对比较,即比较来自0.0126525的{​​{1}}等于来自[1786, 0.0126525]的{​​{1}}依此类推,如果是这样,请按照代码中的说明打印输出。

使用for循环,我实现了结果:

0.0126525

当使用列表索引对循环元素进行成对比较时,由于最后一个元素,我总是会遇到[2463, 0.0126525]的错误。我通过添加条件来解决这个问题

for index, item in enumerate(snplist, 0):
    if index < len(snplist)-1:
        if snplist[index][1] == snplist[index+1][1]:
            print snplist[index][0], snplist[index+1][0], snplist[index][1]

我认为这不是最好的方法。我想知道是否有更复杂的方法在python中对列表元素进行成对比较?

编辑:在比较花车时我没有考虑过公差水平。我会考虑两个'index out of range'差异相同的浮点数。

2 个答案:

答案 0 :(得分:8)

您可zip snplist使用相同的列表排除第一个元素,并进行比较,如下所示

for l1, l2 in zip(snplist, snplist[1:]):
    if l1[1] == l2[1]:
      print l1[0], l2[0], l1[1]

由于您要比较浮点数,我建议使用Python 3.5中的math.isclose函数,就像这样

def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
    return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

如果您想要0.001容差,您可以像这样进行比较

if is_close(l1[1], l2[1], 0.001):

答案 1 :(得分:3)

我建议您使用izip来创建项目邻居对的生成器。抛开比较浮点的问题,代码看起来像这样:

>>> from itertools import izip
>>> lst = [[1,2], [3,4], [5,4], [7,8], [9,10], [11, 10]]
>>> for item, next in izip(lst, lst[1:]):
...     if item[1] == next[1]:
...         print item[0], next[0], item[1]
... 
3 5 4
9 11 10

请记住在比较浮点数时指定容差,将它们与==进行比较!

您可以为此定义almost_equal函数,例如:

def almost_equal(x, y, tolerance):
    return abs(x-y) < tolerance

然后在上面的代码中,使用almost_equal(item[1], next[1], tolerance)而不是与==。

进行比较