gpt4 book ai didi

Python - 如何在检查前向元素时循环遍历列表?

转载 作者:行者123 更新时间:2023-12-01 02:04:00 24 4
gpt4 key购买 nike

目前我正在查看这样的列表:[[x, y, z], [x1, y1, z1], [x2, y2, z2]...]

我想循环比较 x1 与 x2 和 y1 与 y2,如果两者相等,我想将 z2 的值添加到 z1 并将它们放入一个新列表中。

如果 x1 == x2 且 y1 == y2:
list.append(x1, y1, z1+z2)

但是我需要它是连续的,这样如果 x3 和 y3 也等于 x2 和 y2 那么它们将像以前一样添加到一起,并且仅当 x 和 y 的下一个值是 no 时才添加到新列表中不再等于现在。

实际上,如果一个链x1 == x2 == x3 == x4 和 y1 == y2 == y3 == y4 评估为 true 那么新列表应该只包含 [x, y, z1 + z2 + 的一个条目z3 + z4]

到目前为止,我已经在 for 循环(和列表理解)中尝试了递归函数,但是我遇到了各种各样的问题,而且我不知道人们通常如何做这类事情。

期望的输出:

[[x1, y1, z1+z2+z3+z4], [x5, y5, z5], [x6, y6, z6+z7]...]

到目前为止我的代码(有点困惑。中途我感到沮丧并尝试更改很多内容。):

list = [function(oldList, i) for i in range(len(oldList))]

def isNextElementEqual(list, index, totalTimeSpent = 0, count = 0):
if list[index][2] == list[index + 1][2] and list[index][0] == list[index+1][0] and index+1 < len(list):
totalTimeSpent += list[index][1]
count += 1
isNextElementEqual(list, index + 1, totalTimeSpent, count)
elif count > 0:
return [list[index][0], totalTimeSpent, list[index][2]]

最佳答案

使用itertools.groupby

import itertools

l = [[1, 2, 3], [1, 2, 4], [1, 3, 5], [1, 3, 6], [1, 3, 7]]

print ([list(key) + [sum(group[-1] for group in groups)] for key, groups in itertools.groupby(l, lambda x: (x[0], x[1]))])

没有列表理解:

result = []
for key, groups in itertools.groupby(l, lambda x: (x[0], x[1])):
group_res = list(key)
group_res.append(sum(group[-1] for group in groups))
result.append(group_res)

输出:

[[1, 2, 7], [1, 3, 18]]
<小时/>

另一个例子:

l = [[0, 1, 2], [1, 1, 6], [2, 2, 10], [2, 2, 25], [3, 2, 14]]
[list(key) + [sum(group[-1] for group in groups)] for key, groups in itertools.groupby(l, lambda x: (x[0], x[1]))]

输出:

[[0, 1, 2], [1, 1, 6], [2, 2, 35], [3, 2, 14]]

分割:

  • 在此单行代码的最里面部分,您会看到 itertools.groupby(l, lambda x: (x[0], x[1]))。它的作用是通过关键函数 (lambda x: (x[0], x[1])) 对找到的连续值进行分组。在本例中,我们按每个列表中的前两个元素对值进行分组。

  • 此函数返回一个元组,其中包含以及与该键连续匹配的值。这允许我们执行 list(key) + [sum(group[-1] for group in groups)] ,它获取键并将其转换为列表,然后附加最后一个元素的总和到列表中。

关于Python - 如何在检查前向元素时循环遍历列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49247268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com