如何在列表中找到字符串的总和

7
我有一个像这样的列表。
['MGM', '1'], ['MGD', '1'], ['V1', '[0,2,0,1]'], ['AuD', '[0,0,0,1]']

在Python中,我想要找到像这样的字符串列表的总和:

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

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

尽我最大努力学习科学编程。


你的第一个例子是一个列表嵌套列表吗? - Anand S Kumar
@AnandSKumar 他似乎在说它们都是字符串。因此,这是一个字符串列表。但有时候,该字符串表示一个列表。 - RobertB
2
@TonyIto 你尝试过什么?你遇到了什么特定的问题吗?最好发布你的代码并获得评论,而不是期望我们为你编写所有内容。 - RobertB
@RobertB 不,根据示例,它将是一个字符串的列表的列表,这就是为什么我问是否是一个列表的列表。 - Anand S Kumar
嗨,@Anand S Kumar,我也是Python的学习者,但我看到你在这里帮助别人,我该如何直接联系你解决一些问题呢? - coder3521
6个回答

7

假设:

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) - Nir Alfasi
@alfasin,不鼓励使用eval,因为它可以执行有害的Python代码。 - Mark Tolonen

4
这应该可以满足你的需求。注释中有解释。
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
  1. 在声明 my_list 时,你忘记了加上列表的括号。
  2. 你可能想表达的是:num[1] = str(sum(ast.literal_eval(num[1]))) + '',因为你不能将一个 int 追加到一个 str 上。修复这两个问题,你就能得到我的点赞了。
- Nir Alfasi
@alfasin 就它的价值而言,将字符串附加到整数上会将其转换回去,但我已经进行了更新。你的方法更好。 - David
1
@David,不是在Python中:TypeError: unsupported operand type(s) for +: 'int' and 'str' - Mark Tolonen
@MarkTolonen 这是一个3.x规则吗?在我的2.7.9设置中可以工作。 - David
@David,请仔细检查。它会抛出一个TypeError,而你的try/except隐藏了这个错误。在解释器中尝试一下1 + '' - Mark Tolonen

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']]

非常感谢您。是的,这是一场灾难,我会从中吸取教训。 - Tony Ito

1
假设您有一个字符串列表的列表,您可以使用 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']]

1

代码:

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

1
感谢Mark,没有人提到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']]

2
除了@alfasin以外。无论如何,eval 应该是你在处理此类事情时的最后选择。 - John La Rooy
这些值似乎是兼容JSON的。为什么不使用JSON解析库呢? - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接