我有這樣如何找到一個字符串的總和名單
['MGM', '1'], ['MGD', '1'], ['V1', '[0,2,0,1]'], ['AuD', '[0,0,0,1]']
在python
列表。我想找到這樣的字符串列表的總和:
['MGM', '1'], ['MGD', '1'], ['V1', '3'], ['AuD', '1']
我應該將它們首先轉換爲列表中的列表嗎?如果是的話,我會怎麼做呢?
努力學習如何編寫科學代碼。
我有這樣如何找到一個字符串的總和名單
['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]]]
然後將它們轉換回來的列表進行特殊處理:
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']]
這應該做你想要什麼。解釋在評論中。
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
假設你有一個字符串列表的列表,你可以在一個行做到這一點,利用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']]
代碼:
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
>>> 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']]
非常感謝你。是的,這是一場災難,我會從中吸取教訓。 –
感謝馬克,沒有人提到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'應該是你的_last_選項,像這樣的東西 –
這些值看起來是json兼容的。爲什麼不使用json解析庫? –
是您的第一個例子列出的名單? –
@AnandSKumar他似乎在說,他們都是字符串。所以這是一個字符串列表。但是,有時這個字符串代表一個列表。 – RobertB
@TonyIto你有什麼嘗試?你有什麼特別的問題嗎?最好發佈您的代碼並獲得意見,而不是期望我們爲您寫出所有內容。 – RobertB