使用先前列表的值更改创建新列表

时间:2018-07-12 08:10:11

标签: python list-comprehension

例如,我有一个带有浮点数的列表

numbers = [1000.45,1002.98,1005.099,1007.987]

我想创建一个新列表,其中包含数字中的值的增量-即,我希望number [0],[numbers [1]之间的差是新列表中的第一个值。因此,新列表中的第一个数字应为2.53,第二个数字应为2.119,依此类推。

我尝试了列表理解

newnumbers= [i[-1] - i[-2] for i in numbers]

但是它给出了TypeError

TypeError: 'float' object is not subscriptable

我尝试将列表转换为整数,但是随后出现相同类型的错误。

如何创建所需列表?

7 个答案:

答案 0 :(得分:3)

使用熊猫很容易,请使用diff()

import pandas as pd

pd.Series(numbers).diff()

0      NaN
1    2.530
2    2.119
3    2.888
dtype: float64

答案 1 :(得分:1)

您有正确的主意,但语法还不正确。您应该使用:

newnumbers = [(numbers[i] - numbers[i-1]) for i in range(1, len(numbers))]

在您的版本中,您尝试为数字编制索引,但您需要为列表编制索引。

答案 2 :(得分:1)

newnumbers  = []
for i in range(1,len(numbers)-1):
    newnumbers.append(numbers[i]-numbers[i-1])  

答案 3 :(得分:0)

for i in numbers在第一个循环中等于1000.45,然后等于1002.98,依此类推。因此i[-1] = 1000.45[-1]意味着没有意义,您不能下标浮点数

numbers = [1000.45,1002.98,1005.099,1007.987]
newnumbers= [numbers[i+1]-numbers[i] for i in range(len(numbers)-1)]
print(newnumbers)
#[2.5299999999999727, 2.119000000000028, 2.88799999999992]

如果要小数点后2位

newnumbers= [float("%0.2f"%(numbers[i+1]-numbers[i])) for i in range(len(numbers)-1)]
#[2.53, 2.12, 2.89]

答案 4 :(得分:0)

注意如何直接 访问元素,而不使用列表索引; 在Python中执行后者的正确方法是

for index in range(len(numbers)):

您使用的实际上是数字本身。另外,请注意,您必须排除列表的第一个索引,因为您只想要差异(否则,根据Python调用mylist[-1]的行为,第一个调用将再次查看最后一个索引),这就是为什么您可以将范围限制为range(1,len(numbers))的原因。现在,以列表理解的方式可以像这样工作:

newnumbers = [numbers[i] - numbers[i-1] for i in range(1,len(numbers))]

答案 5 :(得分:0)

这是不需要导入任何模块的方法:

numbers = [1000.45,1002.98,1005.099,1007.987]
sliced = numbers[1:]

answer = list(map((lambda x,y: y - x),sliced,numbers))

这给出了:

[-2.5299999999999727, -2.119000000000028, -2.88799999999992]

您可以执行以下操作:

final_answer = [round(x,2) for x in answer]

给出:

[-2.53, -2.12, -2.89]

答案 6 :(得分:0)

>>> numbers = [1000.45,1002.98,1005.099,1007.987]
>>> [round((y-x),2) for x,y in zip(numbers, numbers[1:])]
[2.53, 2.12, 2.89]