Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果满足条件,嵌套列表中的简单元素减法?_Python_Python 3.x_List - Fatal编程技术网

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开始索引计数