Python 如何在列表中查找字符串的和

Python 如何在列表中查找字符串的和,python,list,python-2.7,Python,List,Python 2.7,我有一张这样的清单 ['MGM', '1'], ['MGD', '1'], ['V1', '[0,2,0,1]'], ['AuD', '[0,0,0,1]'] 在python中。我想找到如下字符串列表的总和: ['MGM', '1'], ['MGD', '1'], ['V1', '3'], ['AuD', '1'] 我应该先将它们转换为列表中的列表吗?如果是这样的话,我该怎么做 尽力学习如何为科学编码。给出: s = [['MGM', '1'], ['MGD', '1'], ['V1', '

我有一张这样的清单

['MGM', '1'], ['MGD', '1'], ['V1', '[0,2,0,1]'], ['AuD', '[0,0,0,1]']
在python中。我想找到如下字符串列表的总和:

['MGM', '1'], ['MGD', '1'], ['V1', '3'], ['AuD', '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]]]
[['MGM', '1'], ['MGD', '1'], ['V1', '3'], ['AuD', '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', [0, 2, 0, 1]], ['AuD', [0, 0, 0, 1]]]
[['MGM', '1'], ['MGD', '1'], ['V1', '3'], ['AuD', '1']]

这应该是你想要的。评论中有解释

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

假设您有一个字符串列表,您可以在一行中执行此操作,方法是使用(将字符串作为列表计算),然后在其上使用
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']]
代码:

由于您的数据是一个灾难,我们将使用一个helper函数来求和

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

谢谢马克,没有人提到过评估

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

您的第一个示例是列表列表吗?@AnandSKumar他似乎在说它们都是字符串。这是一个字符串列表。但是,有时字符串表示一个列表。@TonyIto您尝试了什么?你有什么特别的问题吗?最好发布您的代码并获取评论,而不是期望我们为您编写所有内容。@RobertB不,这将是一个字符串列表(根据示例),这就是为什么我问它是否是一个列表列表。您好@Anand S Kumar,我也是python的学习者,但看到您在这里帮助人们,对于一些问题,如何直接联系您,第一步可以通过以下方式完成:
map(lambda t[t[0],eval(t[1])],lst)
aswell@alfasin,
eval
不鼓励使用,因为它会执行破坏性的Python代码。1。您在
my\u list
的声明中忘记了包装列表。2.你的意思可能是:
num[1]=str(sum(ast.literal\u eval(num[1]))+”
,因为你不能将
int
附加到
str
。修正这两个问题,你会得到我的升级票。@alfasin不管它值多少,在int后面加上一个字符串会把它转换回来,但我确实更新了它。您的方式更好。@David,不是在Python中:
TypeError:不支持+:'int'和'str'的操作数类型。
@MarkTolonen这是3.x规则吗?在我的2.7.9设置中工作。@David,仔细检查。它抛出一个
TypeError
,该错误被您的
try/except
隐藏。请在解释器中尝试
1+'
。非常感谢。是的,这是一场灾难,我会从中吸取教训。除了@alfasin。无论如何,
eval
应该是像这样的东西的最后选择。这些值似乎与json兼容。为什么不使用json解析库呢?