我有 3 个列表中的列表。
子列表的字段 1 是名称,字段 2 是数字,字段 3 是数字。这种格式总是一样的,不会改变。 3个列表中总是有相同的名字;但是,顺序可能不同。
a = [['jane', '1', '120'], ['bob', '3', '35'], ['joe', '5', '70']]
b = [['bob', '1', '12'], ['jane', '2', '240'], ['joe', '1', '100']]
c = [['joe', '2', '30'], ['jane', '5', '45'], ['bob', '0', '0']]
我想要一个结果(任何对象类型),其中包含列表子列表的字段 2 和 3 的总和。
result = [['jane', '8', '405'], ['bob', '4', '47'], ['joe', '8', '200']]
在伪 Python3 代码中,我猜它看起来像这样,但我无法找出在 Python3 中执行此操作的正确方法。更不用说以 Pythonic 方式进行了:
def sum_f2_f3(list_a, list_b)
where element[0] in list_a.sub_list == element[0] in list_b.sub_list:
x = element[0]
result[x:1] = list_a.sub_list[0:1] + list_b.sub_list[0:1]
result[x:2] = list_a.sub_list[0:2] + list_b.sub_list[0:2]
return result
result = sum_f2_f3(sum_f2_f3(a,b), c)
有什么想法吗?哪些内置 Python 工具可以帮助我解决这个问题?
最佳答案
为了说明为什么使用正确的数据结构会使事情变得容易得多......
假设 a
、b
和 c
实际上是 dict
,而你的数字实际上是int
而不是 str
。毕竟,dict
的全部意义在于按名称查找事物,而 int
的全部意义在于能够进行算术运算。所以:
a = {'jane': [1, 120], 'bob': [3, 35], 'joe': [5, 70]}
b = {'bob': [1, 12], 'jane': [2, 240], 'joe': [1, 100]}
c = {'joe': [2, 30], 'jane': [5, 45], 'bob': [0, 0]}
现在,您所要做的就是:
result = {}
for d in a, b, c:
for k, v in d.items():
if not k in result:
result[k] = [0, 0]
result[k][0] += v[0]
result[k][1] += v[1]
结果是:
{'bob': [4, 47], 'jane': [8, 405], 'joe': [8, 200]}
还有一点改进的空间——你可以使用 defaultdict
来摆脱 if not k in result:
位——但即使是新手-水平的东西,这是非常紧凑和简单的。
但是,如果您将这些列表作为输入怎么办——您最终希望得到漂亮的指令,但您没有从那里开始?
你可以写一个函数来转换它们,像这样:
def convert(list_of_lists):
result = {}
for element in list_of_lists:
key = element[0]
values = []
for value in element[1:]:
values.append(int(value))
result[key] = values
return result
如果您发现熟悉的 values = []... for value in ... values.append(...)
模式,您可以将其转换为简单的列表理解 [int(value)元素 [1:]] 中的值
。然后整个事情就是相同模式的 dict 等效项,因此您可以将所有内容简化为:
return {element[0]: [int(value) for value in element[1:]] for element in list_of_lists}
同时,如果你需要转换回原来的形式,那就是:
def unconvert(dict_of_lists):
result = []
for key, values in dict_of_lists.items():
element = [key] + [str(value) for value in values]
result.append(element)
return result
关于python - 如何在某些子列表的字段上对多个列表列表求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17097786/