我有一个嵌套列表,结构如下:
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], and mylist[2]
。mylist[0]
包含 2 个元素,mylist[1]
包含 2 个元素,mylist[2]
包含 1 个元素。
如果满足某个条件,我想减去两个值。在这种情况下,它是这样的:
如果mylist
中的一个元素包含 2 个元素(如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]
,所以它应该有一个range(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']
编辑:如果mylist[3]
有另一个元素包含 2 个元素,数学仍然会完成(即使mylist[2]
有 1 个元素......所以前一个元素的长度无关紧要(,其中来自mylist[3]
的数字,假设是 9,将从mylist[2]
中减去数字,给出:mylist[3][0][0][0] - mylist[2][-1][-1][0] = 1.0
.
您可以使用枚举循环访问列表并从列表中的索引 1 开始,并将起始值设置为 1。然后,这将从索引 1 及以后循环遍历列表中的项目,然后您可以使用索引通过从当前索引中减去 1 来引用上一个列表。
for index, sub_list in enumerate(mylist[1:], 1):
if len(sub_list) == 2:
this_val = int(mylist[index][0][0][0])
prev_val = int(mylist[index - 1][-1][-1][0])
result = this_val - prev_val
print(f'{this_val} - {prev_val} = {result}')
输出
4 - 3 = 1