将 python 中的列表与唯一元素组合,但更改第三个

Combining lists in python with unique elements but changing the third

我有两个不同的三列实验列表。我只想将列表合并为一个,但如果它们具有相同的第一个和第二个元素,则计算第三个值之间的平均值,取该结果并删除另外两个。

示例:

列表 1:

[[ 2, '+', 4 ], [ 4, '-', 6 ], [ 8, '+', 2 ]]

列表 2:

[[ 2, '-', 4 ], [ 4, '-', 2], [ 8, '+', 2 ]]

预期输出:

[[ 2, '+', 4 ], [ 2, '-', 4 ], [ 4, '-', 4 ], [ 8, '+', 2 ]]

我正在尝试遍历列表,但我无法避免附加重复结果。

使用字典根据前两个元素收集项目:

expressions = {}
for left, op, right in list1 + list2:
    expressions.setdefault((left, op), []).append(right)

然后用收集到的右侧操作数的平均值构建一个新列表:

[[left, op] + [sum(rights) // len(rights)] for (left, op), rights in expressions.items()]

演示:

>>> list1 = [[ 2, '+', 4 ], [ 4, '-', 6 ], [ 8, '+', 2 ]]
>>> list2 = [[ 2, '-', 4 ], [ 4, '-', 2], [ 8, '+', 2 ]]
>>> expressions = {}
>>> for left, op, right in list1 + list2:
...     expressions.setdefault((left, op), []).append(right)
... 
>>> [[left, op] + [sum(rights) // len(rights)] for (left, op), rights in expressions.items()]
[[4, '-', 4], [8, '+', 2], [2, '-', 4], [2, '+', 4]]

请注意,由于字典不跟踪顺序,因此任何顺序都会丢失;如果这很重要,你必须切换到使用 collections.OrderedDict()

不完全确定你在问什么。据我了解这个问题,您想比较 元素,如果这些对具有相同的前两个元素,则添加该对的 "mean" ,否则添加两个元素加入列表。

为了迭代这些对,您应该使用 zip 内置函数。试试这个:

lst_A = [[ 2, '+', 4 ], [ 4, '-', 6], [ 8, '+', 2 ]]
lst_B = [[ 2, '-', 4 ], [ 4, '-', 2], [ 8, '+', 2 ]]
res = []
for a, b in zip(lst_A, lst_B):
    if a[:2] == b[:2]:
        res.append([a[0], a[1], (a[2] + b[2])/2])
    else:
        res.extend([a, b])

结果是[[2, '+', 4], [2, '-', 4], [4, '-', 4], [8, '+', 2]]