2015-10-13 19 views
7

Ich habe eine Liste wie dieseWie die Summe einer Zeichenfolge in einer Liste finden

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

in Python. Ich möchte die Summe der Listen, die Zeichenfolgen wie folgt sind:

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

Sollte ich sie in Listen in den Listen zuerst konvertieren? Wenn ja, wie würde ich das tun?

Ich versuche mein Bestes, um zu lernen, wie man für die Wissenschaft kodiert.

+0

Ist Ihr erstes Beispiel eine Liste von Listen BE-? –

+0

@AnandSKumar er scheint zu sagen, dass sie alle Saiten sind. Es ist also eine Liste von Strings. Manchmal stellt die Zeichenfolge jedoch eine Liste dar. – RobertB

+2

@TonyIto Was hast du probiert? Gibt es ein bestimmtes Problem, das Sie haben? Am besten veröffentlichen Sie Ihren Code und erhalten Kommentare, anstatt zu erwarten, dass wir alles für Sie schreiben. – RobertB

Antwort

7

Gegeben:

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

Im Folgenden werden die zweiten Elemente Python-Objekte konvertieren:

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

Ergebnis:

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

sie dann zurück konvertieren mit Sonderbehandlung für Listen:

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

Ergebnis:

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

Der erste Schritt kann getan werden durch: 'map (Lambda t: [ t [0], eval (t [1])], lst) 'sowie – alfasin

+0

@alfasin, eval wird davon abgeraten, da schädlicher Python-Code ausgeführt werden kann. –

+0

Einverstanden. 's/eval/ast.literal_eval' und nochmal lesen :) – alfasin

4

Dies sollte das tun, was Sie wollen. Erklärung ist in den Kommentaren.

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. Sie haben die Umbruchliste in der Deklaration von' my_list' vergessen. 2. Sie haben wahrscheinlich gemeint: 'num [1] = str (Summe (ast.literal_eval (num [1]))) '' 'weil Sie kein' int' an ein 'str' anhängen können. Fix diese zwei und du wirst meine Aufwertung bekommen. – alfasin

+0

@alfasin für was es wert ist, das Anhängen eines Strings an den int konvertiert es zurück, aber ich habe es aktualisiert. Dein Weg ist besser. – David

+1

@David, nicht in Python: 'TypeError: nicht unterstützte Operandentyp (en) für +: 'int' und 'str'' –

1

Angenommen, Sie haben eine Liste der Liste von Strings, können Sie diese Zeile in einer tun, durch ast.literal_eval() mit (die Zeichenfolge als eine Liste zu bewerten) und dann sum() auf es zu benutzen. Beispiel -

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

Obwohl es ein wenig unlesbar ist. Ein bisschen besser lesbare Version mit for Schleifen -

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

Demo -

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

Code:

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

Da Ihre Daten eine Katastrophe ist, werden wir einen Helfer verwenden Funktion für die Summe

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

können JSON oder literal_eval verwenden, um die Saiten zu dekodieren

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

vielen Dank. Ja, es ist eine Katastrophe und ich werde daraus lernen. –

1

Danke Mark, Niemand eval erwähnt!

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 

können andere ein

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 

druckt

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

Außer @alfasin. Anyway 'eval' sollte deine _last_ Wahl für Sachen wie diese sein –

+0

die Werte scheinen json-kompatibel zu sein. Warum verwenden Sie keine JSON-Parsing-Bibliothek? –

Verwandte Themen