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



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

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

if x1 == x2 and y1 == y2: list.append(x1, y1, z1+z2)

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

实际上,如果链x1 == x2 == x3 == x4 and 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]))。在这种情况下,我们按每个列表中的前两个元素对值进行分组。

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

这需要您检查列表 y 中的每个值,以获取每个 x,这将变得计算成本高昂。但它有效。

x = [[ 0,  1,  2],
[ 1,  1,  6],
[ 2,  2, 10],
[ 2,  2, 25],
[ 3,  2, 14]]
y = [x[0]]
for val in x[1:]:
for ix, i in enumerate(y):
if val[0] == i[0] and val[1] == i[1]:
i[2] += val[2]
break
else: y.append(val)
print(y)

最新更新