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