【问题标题】:How to find the sum of a string in a list如何在列表中查找字符串的总和
【发布时间】:2015-10-13 05:20:19
【问题描述】:

我有一个这样的列表

['MGM', '1'], ['MGD', '1'], ['V1', '[0,2,0,1]'], ['AuD', '[0,0,0,1]']

在 python 中。我想找到像这样的字符串列表的总和:

['MGM', '1'], ['MGD', '1'], ['V1', '3'], ['AuD', '1']

我应该先将它们转换为列表中的列表吗?如果是这样,我将如何处理?

尽我所能学习如何为科学编写代码。

【问题讨论】:

  • 您的第一个示例是列表列表吗?
  • @AnandSKumar 他似乎在说它们都是字符串。所以它是一个字符串列表。但是,有时字符串代表一个列表。
  • @TonyIto 你试过什么?你有什么特别的问题吗?最好发布您的代码并获取 cmets,而不是期望我们为您编写所有代码。
  • @RobertB 不,这将是一个字符串列表(根据示例),这就是为什么我问它是否是一个列表列表。
  • 嗨@Anand S Kumar,我也是python的学习者,但是看到你在这里帮助别人,我怎么能直接联系你解决一些问题,

标签: python list python-2.7


【解决方案1】:

给定:

s = [['MGM', '1'], ['MGD', '1'], ['V1', '[0,2,0,1]'], ['AuD', '[0,0,0,1]']]

以下将第二项转换为 Python 对象:

import ast
for sublist in s:
    sublist[1] = ast.literal_eval(sublist[1])

结果:

[['MGM', 1], ['MGD', 1], ['V1', [0, 2, 0, 1]], ['AuD', [0, 0, 0, 1]]]

然后通过对列表的特殊处理将它们转换回来:

for sublist in s:
    if isinstance(sublist[1],list):
        sublist[1] = sum(sublist[1])
    sublist[1] = str(sublist[1])

结果:

[['MGM', '1'], ['MGD', '1'], ['V1', '3'], ['AuD', '1']]

【讨论】:

  • 第一步可以通过:map(lambda t: [t[0], eval(t[1])], lst) 也可以
  • @alfasin, eval 不鼓励使用,因为它可以执行破坏性的 Python 代码。
【解决方案2】:

这应该做你想做的事。说明在 cmets 中。

import ast

# Create the list
myList = [['MGM', '1'], ['MGD', '1'], ['V1', '[0,2,0,1]'], ['AuD', '[0,0,0,1]']]

# Loop through each sublist
for num in myList:
    # try to convert the string to a list and sum it
    try:
        # This works by evaluating the string into a list object
        # Then summing the numbers in the list
        # then turning that number back into a string so it's like the rest
        num[1] = str(sum(ast.literal_eval(num[1])))
    # If it fails, it must just be a number, so ignore
    except TypeError:
        pass

print myList

【讨论】:

  • 1.你忘记了my_list 声明中的包装清单。 2. 您可能的意思是:num[1] = str(sum(ast.literal_eval(num[1]))) + '' ,因为您不能将int 附加到str。解决这两个问题,你就会得到我的支持。
  • @alfasin 对于它的价值,将字符串附加到 int 会将其转换回来,但我确实更新了它。你的方法更好。
  • @David,不在 Python 中:TypeError: unsupported operand type(s) for +: 'int' and 'str'
  • @MarkTolonen 这是 3.x 规则吗?在我的 2.7.9 设置中工作。
  • @David,请仔细检查。它会抛出一个 TypeError,它被您的 try/except 隐藏。只需在解释器中尝试1 + ''
【解决方案3】:
>>> s = [['MGM', '1'], ['MGD', '1'], ['V1', '[0,2,0,1]'], ['AuD', '[0,0,0,1]']]

由于您的数据是一场灾难,我们将使用辅助函数进行求和

>>> def mysum(L):
...     try:
...         return sum(L)
...     except TypeError:
...         return L
... 

可以使用 JSON 或 literal_eval 来解码字符串

>>> import json
>>> [[i, str(mysum(json.loads(j)))] for i, j in s]
[['MGM', '1'], ['MGD', '1'], ['V1', '3'], ['AuD', '1']]

【讨论】:

  • 非常感谢。是的,这是一场灾难,我会从中吸取教训。
【解决方案4】:

假设您有一个字符串列表,您可以在一行中执行此操作,方法是使用ast.literal_eval()(将字符串评估为列表),然后在其上使用sum()。示例 -

lst1 = [[a, (str(sum(ast.literal_eval(b))) if b.startswith('[') else b)] for a,b in lst]

虽然它有点不可读。使用for 循环的更易读的版本 -

lst1 = []
for a,b in lst:
    if b.startswith('['):
        lst1.append([a, (str(sum(ast.literal_eval(b)))])
    else:
        lst1.append([a,b])

演示 -

>>> lst = [['MGM', '1'], ['MGD', '1'], ['V1', '[0,2,0,1]'], ['AuD', '[0,0,0,1]']]
>>> import ast
>>> lst1 = [[a, (str(sum(ast.literal_eval(b))) if b.startswith('[') else b)] for a,b in lst]
>>> lst1
[['MGM', '1'], ['MGD', '1'], ['V1', '3'], ['AuD', '1']]

【讨论】:

    【解决方案5】:

    代码:

    from ast import literal_eval
    los=[['MGM', '1'], ['MGD', '1'], ['V1', '[0,2,0,1]'], ['AuD', '[0,0,0,1]']]
    for lst in los :
        if '[' in lst[1]:
            lst[1]=sum(literal_eval(lst[1]))
    print los
    

    【讨论】:

      【解决方案6】:

      谢谢马克,没有人提到eval

      lst = [['MGM', '1'], ['MGD', '1'], ['V1', '[0,2,0,1]'], ['AuD', '[0,0,0,1]']]
      for sublist in lst:
          sublist[1] = eval(sublist[1])
      for sublist in lst:
          if isinstance(sublist[1],list):
              sublist[1] = sum(sublist[1])
          sublist[1] = str(sublist[1])
      print lst
      

      另一个可以是-

      lst = [['MGM', '1'], ['MGD', '1'], ['V1', '[0,2,0,1]'], ['AuD', '[0,0,0,1]']]
      
      for x in lst:
          x[1] = str(sum([int(i) for i in x[1].replace("[","").replace("]","").split(',')]))
      
      print lst
      

      打印出来

      [['MGM', '1'], ['MGD', '1'], ['V1', '3'], ['AuD', '1']]
      

      【讨论】:

      • @alfasin 除外。无论如何,eval 应该是你最后选择这样的东西
      • 这些值似乎与 json 兼容。为什么不用json解析库?
      猜你喜欢
      • 1970-01-01
      • 2021-01-18
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      相关资源
      最近更新 更多