4

我有以下问题,我似乎无法找到答案。我的 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 等)的因子差异。

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

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 中的数据,但它将包含以下零值,这给了我之前除零问题。

编辑:感谢您的解决方案,他们中的大多数都完全符合我的要求。不幸的是,这些列表中的项目有一个固定的位置。这些信息,我不能丢弃,所以从列表中过滤掉一些项目以防止像“ZeroDivisionError:浮点除以零”这样的错误并不是一个真正的选择。为了解释更多,可能有以下格式的列表:

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

等等

上次编辑:无论如何我都会过滤数据,而不是创建要修复的问题。感谢大家的回答!

4

5 回答 5

4

使用pairwiseitertools配方中的函数:

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)]
于 2013-07-30T12:00:44.527 回答
1

Check out this solution also:

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)

Test:

>>> 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
>>>
于 2013-07-30T12:24:08.353 回答
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)]
于 2013-07-30T12:02:14.883 回答
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
于 2013-07-30T11:56:31.323 回答
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
于 2013-07-30T11:54:49.880 回答