我有以下问题,我似乎无法找到答案。 我的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
等
上次修改:无论如何我都会过滤数据,而不是创建要解决的问题。 谢谢你的答案!
答案 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