计算两个列表项之间的因子差异

时间:2013-07-30 11:40:54

标签: python

我有以下问题,我似乎无法找到答案。 我的python知识是基本的,我现在正在使用2.7.2和2.6.5版本。

假设我有以下列表:

list1 = [1642842,780497,1506284,1438592,1266530,1154853,965861,610252,1091847,1209404,1128111,749998]

我想知道每2个项目的因子差异(项目0,1项目1,2项目2,3等)。

输出应该是这样的(但最好是四舍五入到小数):

list2 = [2.1048665145,0.5181605859,1.047054342,1.1358530789,1.0967023509,1.195672048, 1.5827248415,0.5589171377,0.9027975763,1.0720611713,1.5041520111]

我正在寻找的最终结果是当因子超过1.5时,我想报告2个列表项数字及其因子值。

项目0,1 价值2.1

项目6,7 价值1.6

项目10,11 值1.5

我该怎么做?

使用以下方法可以轻松找到数字差异:

print numpy.diff(list1)

for i in (abs(x - y) for (x, y) in zip(list1[1:], list1[:-1])):
    print i

但我突然想要找到上面问题的解决方案? 我用上面的代码尝试了一些东西,但我似乎无法获得好的结果。

另请注意,虽然我会首先过滤list1中的数据,但它会包含以下零值,这给我以前的divbyzero问题。

编辑:感谢您的解决方案,他们中的大多数都完全符合我的要求。不幸的是,这些列表中的项目具有固定的位置。这个信息,我不能丢弃,所以过滤列表中的一些项目以防止像'ZeroDivisionError:float division by zero'这样的错误实际上不是一个选项。为了解释一下,可能会有以下格式的列表:

list1 = [0,0,0,0,0,0,0,0,2,5,65,456,456456,456564,456666,666666,2344,233,232,122,88,6,0,0,0,0]

使用以下任何解决方案解决此问题的pythonic方法是什么? 更具体地说明输出:

项目0,1值0

第1,2项价值0

第2,3项价值0

项目8,9价值2.5

第9,10项价值13

上次修改:无论如何我都会过滤数据,而不是创建要解决的问题。 谢谢你的答案!

5 个答案:

答案 0 :(得分:4)

使用itertools recipe中的pairwise函数:

import itertools

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return itertools.izip(a, b)

diff = [round(abs(x/float(y)), 1) for x, y in pairwise(your_iterable)]

答案 1 :(得分:1)

一种可能的方式:

list1 = [1642842,780497,1506284,1438592,1266530,1154853,965861,610252,1091847,1209404,1128111,749998]
list2 = [(i, a, b, (1.0*a)/b) for (i, (a, b)) in enumerate(zip(list1, list1[1:]))]
for i, a, b, f in filter(lambda (i, a, b, f): f > 1.5, list2):
    print 'item {0} ({1}), {2} ({3}) value {4:.1f}'.format(i, a, i+1, b, f)

输出:

item 0 (1642842), 1 (780497) value 2.1
item 6 (965861), 7 (610252) value 1.6
item 10 (1128111), 11 (749998) value 1.5

答案 2 :(得分:1)

>>> g = ((i, i + 1, round(1.0 * list1[i] / list1[i + 1], 2)) for i in range(len(list1) - 1))
>>> print [x for x in g if x[2] >= 1.5]
[(0, 1, 2.1), (6, 7, 1.58), (10, 11, 1.5)]

>>> g1 = ((i, i + 1) for i in range(len(list1) - 1))
>>> g2 = ((x, y, round(float(list1[x]) / list1[y], 2)) for x, y in g1)
>>> print [x for x in g2 if x[2] >= 1.5]
[(0, 1, 2.1), (6, 7, 1.58), (10, 11, 1.5)]

答案 3 :(得分:1)

同时查看此解决方案:

a = [..., ..., ]

for i,v in enumerate(map(lambda t: float(t[0])/float(t[1]), zip(a, a[1:]))):
    print "{0},{1} - {2:.1f}".format(i,i+1,v)

测试:

>>> a
[24144, 24666, 10421, 28925, 23619, 13703, 20766, 10029, 23655, 22183]
>>> for i,v in enumerate(map(lambda t: float(t[0])/float(t[1]), zip(a, a[1:]))):
...     print "{0},{1} - {2:.1f}".format(i,i+1,v)
...
0,1 - 1.0
1,2 - 2.4
2,3 - 0.4
3,4 - 1.2
4,5 - 1.7
5,6 - 0.7
6,7 - 2.1
7,8 - 0.4
8,9 - 1.1
>>>

答案 4 :(得分:0)

怎么样?
  for i in (float(x)/y if x > y else float(y)/x for (x, y) in zip(list1[1:], list1[:-1])):
      print i