【问题标题】:sum numbers in a tuple and average them not working对元组中的数字求和并平均它们不起作用
【发布时间】:2017-03-24 04:41:29
【问题描述】:

我有一个返回元组的数据库查询,如下所示

[6,6,6,5,5,5,4,4]
[10,10,10,11,11,11]
[3597590, 3597588,3597558,3597544,3597590]

我想得到每组的平均值。我试图用不同的方式总结它们,例如

for row in cur.fetchall(
x = row[4]
print map(sum, x) 

它抛出一个错误 类型错误:+ 的不支持的操作数类型:'int' 和 'str'

我尝试转换为 int 但也抛出错误 ValueError: int() 以 10 为底的无效文字:'['

【问题讨论】:

  • 它正在返回字符串
  • 试试map(sum, map(int, x))
  • same valueError for int() with base 10
  • 我认为 map(sum,map(int,x[1:-1])) 应该这样做。它从 x 中删除括号
  • 数据库实际上是否包含带有[] 的字符串?为什么?它应该是JSON吗?然后你应该使用json.loads() 将其解析为 Python 列表。

标签: python


【解决方案1】:

看起来您有一个表示整数列表的字符串,在这种情况下,您可以使用ast 模块,更准确地说是ast.literal_eval 函数将其转换为实际列表并求和

>>> import ast
>>> test = "[3597590, 3597588,3597558,3597544,3597590]"
>>> x=ast.literal_eval(test)
>>> x
[3597590, 3597588, 3597558, 3597544, 3597590]
>>> sum(x)
17987870
>>> 

如果你得到的是一个看起来像你的例子的字符串,那么你可以使用 splitlines 方法来获取每一行

>>> test2="""[6,6,6,5,5,5,4,4]
[10,10,10,11,11,11]
[3597590, 3597588,3597558,3597544,3597590]"""
>>> lines = test2.splitlines()
>>> lines
['[6,6,6,5,5,5,4,4]', '[10,10,10,11,11,11]', '[3597590, 3597588,3597558,3597544,3597590]']
>>> map(sum,map(ast.literal_eval,lines))
[41, 63, 17987870]
>>> 

正如 cmets 中提到的,json 模块是另一种选择

>>> import json
>>> test
'[3597590, 3597588,3597558,3597544,3597590]'
>>> json.loads(test)
[3597590, 3597588, 3597558, 3597544, 3597590]
>>>

【讨论】:

    【解决方案2】:

    @Copperfield 的答案可能是解决上述问题的正确方法。

    也就是说,我认为您应该在上游而不是在 Python 中处理问题。在查询中使用 SQL SUM and AVERAGE functions,以便由 SQL 引擎完成工作。

    【讨论】:

      猜你喜欢
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 2020-06-15
      相关资源
      最近更新 更多