簡體   English   中英

計算兩個列表項之間的因子差異

[英]Calculate factor difference between two list items

我有以下問題,我似乎無法找到答案。 我的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

等等

上次編輯:無論如何我都會過濾數據,而不是創建要解決的問題。 謝謝你的答案!

使用itertools 配方中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)]

一種可能的方式:

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
>>> 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)]

看看這個解決方案:

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
>>>

關於什么

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM