2015-10-13 22 views
7

我有這樣如何找到一個字符串的總和名單

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

列表。我想找到這樣的字符串列表的總和:

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

我應該將它們首先轉換爲列表中的列表嗎?如果是的話,我會怎麼做呢?

努力學習如何編寫科學代碼。

+0

是您的第一個例子列出的名單? –

+0

@AnandSKumar他似乎在說,他們都是字符串。所以這是一個字符串列表。但是,有時這個字符串代表一個列表。 – RobertB

+2

@TonyIto你有什麼嘗試?你有什麼特別的問題嗎?最好發佈您的代碼並獲得意見,而不是期望我們爲您寫出所有內容。 – RobertB

回答

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

第一步可以通過:map(lambda t:[ t [0],eval(t [1])],lst)' – alfasin

+0

@alfasin,因爲它可以執行損壞的Python代碼,所以不鼓勵使用'eval'。 –

+0

同意。 's/eval/ast.literal_eval'並再次閱讀:) – alfasin

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'。解決這兩個問題,你會得到我的讚賞。 – alfasin

+0

@alfasin值得注意的是,將一個字符串附加到int會將其轉換回來,但是我更新了它。你的方式更好。 – David

+1

@David,不在Python中:'TypeError:不支持的操作數類型爲+:'int'和'str'' –

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

非常感謝你。是的,這是一場災難,我會從中吸取教訓。 –

1

感謝馬克,沒有人提到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'應該是你的_last_選項,像這樣的東西 –

+0

這些值看起來是json兼容的。爲什麼不使用json解析庫? –

相關問題