python - 如何在某些子列表的字段上对多个列表列表求和?

标签 python python-3.x

我有 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 工具可以帮助我解决这个问题?

最佳答案

为了说明为什么使用正确的数据结构会使事情变得容易得多......

假设 abc 实际上是 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/

相关文章:

python - TensorFlow:在自定义图像数据集上训练模型

python - 将脚本移至目录中,导入现在失败

python - 使用 CherryPy 延迟声明静态文件/文件夹

python - 如何检查用于日志记录的处理程序?

python - 我如何查看 ponyorm 生成的 SQL?

python - pipenv 安装给出 "pew is not in your PATH"

python - 使用 f 字符串作为模板

python - 移植到 Python 3 : string/bytes formatting

python - 在 Python 中重试连接之前暂停

python - 在 scikit-learn 中使用交叉验证时绘制 Precision-Recall 曲线