Python 如果满足条件,嵌套列表中的简单元素减法?
我有一个嵌套列表,结构如下:Python 如果满足条件,嵌套列表中的简单元素减法?,python,python-3.x,list,Python,Python 3.x,List,我有一个嵌套列表,结构如下: mylist = [ [ [ ['1', '2019-12-10 9:54'] ], [ ['2', '2019-12-10 15:54'], ['3', '2019-12-10 15:57'] ] ], [ [ ['4', '2019-12-12 9:51']
mylist = [
[
[
['1', '2019-12-10 9:54']
],
[
['2', '2019-12-10 15:54'],
['3', '2019-12-10 15:57']
]
],
[
[
['4', '2019-12-12 9:51']
],
[
['5', '2019-12-12 15:51'],
['6', '2019-12-12 15:53'],
['7', '2019-12-12 15:59']
]
],
[
[
['8', '2019-12-13 15:52']
]
]
]
父列表
mylist
包含3个元素:mylist[0]、mylist[1]和mylist[2]
mylist[0]
包含2个元素,mylist[1]
包含2个元素,mylist[2]
包含1个元素
如果满足某个条件,我想减去两个值。在这种情况下,是这样的:
如果mylist
中的一个元素包含两个元素(如mylist[0]
和mylist[1]
do),我想从该列表中的一个元素中减去上一个列表中的一个元素。更具体地说:
由于mylist[1]
包含2个元素,因此它符合条件,因此应始终进行以下计算:
mylist[1][0][0][0]-mylist[0][1][1][0]
,翻译为4-3=1
当
mylist
的任何元素包含两个元素时,即:
for i in mylist:
if len(i) == 2:
do the operation!
但是操作不应该在第一个元素mylist[0]
上执行,因此它应该有一个范围(1,len(mylist))
为此,我使用了以下代码:
mylist = [ ... same as above ... ]
subtracted = []
for i in mylist:
if len(i) == 2:
math = [float(mylist[i][0][0][0]) - float(mylist[i-1][-1][-1][0]) for i in range(1, len(mylist))]
for b in math:
newb = str(b) + " at Time: " + i[0][0][1]
subtracted.append(newb)
print(subtracted)
所需输出为:
Desired output:
["1.0 at Time: 2019-12-12 9:51"]
因为我们将使用mylist[1]
(它有2个元素)执行操作,但不使用mylist[0]
(它是列表的开始,因此超出范围),也不使用mylist[2]
(它只包含1个元素)
然而,我不断得到以下信息,我不知道为什么。我在网上搜索了一个小时,但没有找到任何有用的信息。有人知道这样做的更好的脚本是什么吗
Actual output:
['1.0 at Time: 2019-12-10 9:54', '1.0 at Time: 2019-12-10 9:54', '1.0 Time: 2019-12-12 9:51', '1.0 at Time: 2019-12-12 9:51']
EDIT:如果另一个元素
mylist[3]
中包含2个元素,则仍然会进行计算(即使mylist[2]
有1个元素…因此前一个元素的长度无关紧要),其中mylist[3]
中的数字是9,将从mylist[2]
中减去数字,给出:mylist[3][0][0]-mylist[2][1][1]=1.0
您可以使用enumerate在列表上迭代,从列表中的索引1开始,并将开始值设置为1。然后,这将循环遍历索引1及以后的列表中的项目,然后您可以使用该索引从当前索引中减去一个来引用上一个列表
对于索引,枚举中的子列表(mylist[1:],1):
如果len(子列表)=2:
此值=int(mylist[index][0][0][0])
prev_val=int(mylist[索引-1][1][1][0])
结果=此值-上一个值
打印(f'{this_val}-{prev_val}={result}')
输出
4 - 3 = 1
如果要将字符串作为数字进行操作,为什么列表中会有字符串?@Barmar I Barmar,这就是我获取数据的方式。我必须将字符串转换回整数或浮点数才能进行数学运算。答案很好,完全符合我的要求!我在mylist中又添加了一些元素,效果很好!
enumerate()
是否返回从0
开始的索引,而不是1
?因此,index
是上一个索引。您可以传递一个起始值,从该值开始索引并将其递增1,因此在我的代码中,我传递以从index1开始枚举元素,并从1开始索引计数。enumerate的签名是enumerate(iterable,start=0)
因此传递enumerate(mylist[1:],1)
将枚举索引1上的项目,并从1开始索引计数