我有两个不同的实验列表,有三列。我想仅将列表合并为一个,但如果它们具有相同的第一个和第二个元素,则执行三分之一值之间的平均值,获取结果并删除其他两个。
示例:
清单1:
[[ 2, '+', 4 ], [ 4, '-', 6 ], [ 8, '+', 2 ]]
清单2:
[[ 2, '-', 4 ], [ 4, '-', 2], [ 8, '+', 2 ]]
预期产出:
[[ 2, '+', 4 ], [ 2, '-', 4 ], [ 4, '-', 4 ], [ 8, '+', 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]]