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

时间:2015-03-10 10:20:17

标签: python merge unique mean

我有两个不同的实验列表,有三列。我想仅将列表合并为一个,但如果它们具有相同的第一个和第二个元素,则执行三分之一值之间的平均值,获取结果并删除其他两个。

示例:

清单1:

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

清单2:

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

预期产出:

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

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

2 个答案:

答案 0 :(得分:1)

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

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()

答案 1 :(得分:0)

不完全确定你在问什么。据我所知,你想要比较元素,如果这些对具有相同的前两个元素,则添加" 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]]