2017-10-08 1 views
-3

Ich habe Probleme mit dieser Funktion. Es funktioniert nicht, wenn ich versuche, es auszuführen. Kann mir bitte jemand helfen, es zu reparieren?Wie kann man einen Nicht-Typ aus einer Liste von Strings zurückgeben?

def string_avg_update(L): 
    '''(list of str) -> NoneType 
    Given a list of strings where each string has the format: 
    'name, grade, grade, grade, ...' update the given 
    list of strs to be a list of floats where each item 
    is the average of the corresponding numbers in the 
    string. Note this function does NOT RETURN the list. 
    >>> L = ['Anna, 50, 92, 80', 'Bill, 60, 70', 'Cal, 98.5, 100, 95.5, 98'] 
    >>> string_avg_update(L) 
    >>> L 
    [74.0, 65.0, 98.0] 
    ''' 
    average = 0 
    for item in L: 
     if item.isdigit(): 
      average = sum(item)/len(item) 
+3

Also was genau ist das Problem? – Mureinik

+0

Ich bekomme nicht [74.0, 65.0, 98.0], was ich von dem Beispiel im Docstring bekommen möchte – dg123

+1

Zuerst müssen Sie jeden dieser Strings teilen, damit Sie die Daten daraus extrahieren können. Dann musst du das Zeug nach dem Namen in Floats umwandeln. Dann können Sie diese Floats arithmetisch ausführen. Und dann können Sie das Ergebnis in den entsprechenden Listeneintrag zurückspeichern. Versuche, einen Code zu schreiben, der diese Dinge tut. –

Antwort

0
def string_avg_update(L): 
    for x in range(len(L)): 
     split = L[x].split(',') 
     for y in range(1, len(split)): 
      split[y] = float(split[y]) 
     summation = sum(split[z] for z in range(1, len(split))) 
     average = summation/(len(split)-1) 
     L[x] = average 

L = ['Anna, 50, 92, 80', 'Bill, 60, 70', 'Cal, 98.5, 100, 95.5, 98'] 

string_avg_update(L) 

print(L) 

Returns:

[74.0, 65.0, 98.0] 

Nach Update:

Schleife durch L und erstellen Sie eine neue Liste, geteilt, die die Elemente in L spaltet, wo es Kommas sind. Ändern Sie dann die Zeichenfolgen an den gewünschten Stellen. Führen Sie dann die Summe und den Durchschnitt auf den Schwimmern aus. Setzen Sie das Element in L auf den berechneten Durchschnittswert.

+0

Ist das für z in Reichweitenanweisung in einer neuen Zeile? – dg123

+0

Ich bekomme die Namen für diese, wenn ich es betreibe, aber ich will nur die Durchschnittswerte – dg123

+0

Nein das für z kann einfach so geschrieben werden ... Der Code funktioniert für mich. Stimmen Ihre tatsächlichen Daten nicht mit dem überein, was Sie in L gezeigt haben? – kbball

0

aktualisieren

Nun, da ich verstehe, was Sie (mit @PM 2Ring Hilfe), hier zu tun versuchen ist eine ganz andere Antwort (das Problem viel einfacher als ich ursprünglich dachte eigentlich ist). Es wäre hilfreich, wenn Sie entweder meine ursprüngliche Antwort oder verschiedene Kommentare von mir und anderen reagiert und erklärt, was Sie versuchen, besser zu tun ...

def string_avg_update(L): 
    '''(list of str) -> NoneType 

    Given a list of strings where each string has the format: 
    'name, grade, grade, grade, ...' update the given 
    list of strs to be a list of floats where each row 
    is the average of the corresponding numbers in the 
    string. Note this function does NOT RETURN the list. 

    >>> L = ['Anna, 50, 92, 80', 'Bill, 60, 70', 'Cal, 98.5, 100, 95.5, 98'] 
    >>> string_avg_update(L) 
    >>> L 
    [74.0, 65.0, 98.0] 
    ''' 
    # Replace contents of L with average of numeric values in each string elem. 
    for i, record in enumerate(L): 
     grades = [float(grade) for grade in record.split(',')[1:]] 
     L[i] = sum(grades)/len(grades) 

    # Function will implicitly return None since there's no return statement. 

if __name__ == '__main__': 

    L = ['Anna, 50, 92, 80', 'Bill, 60, 70', 'Cal, 98.5, 100, 95.5, 98'] 
    print(L) 
    string_avg_update(L) 
    print(L) # -> [74.0, 65.0, 98.0] 
+0

Was bedeutet zip? wie macht es das? – dg123

+0

Es ist [genau hier] (https://docs.python.org/3/library/functions.html#zip) in der [Online-Dokumentation] (https://docs.python.org/3/index.html) . Kurz gesagt, es braucht zwei oder mehr Listen und erzeugt (yield's) Gruppen (Tupel) von Elementen, die aus der gleichen Position in jedem der Elemente in jeder seiner Eingabeargumentsequenzen extrahiert werden. dh 'zip ([1, 2, 3], [4, 5, 6])' gibt eine iterierbare Ausbeute zurück (1, 4) ',' (2, 5) ', dann' (3, 6) ' folgerichtig. Wenn Sie es in einen Konstruktoraufruf 'list()' umbrechen, erhalten Sie eine Liste mit '[(1, 4), (2, 5), (3, 6)]'. – martineau

+0

dg123: Beantwortet das deine Frage zu 'zip()'? Beantwortet meine Antwort die richtigen Ergebnisse? Wenn nicht, bitte bearbeiten Sie Ihre Frage und beschreiben Sie, wie die gewünschten Werte aus den Eingabewerten berechnet werden. – martineau

0

Wir Schleife über die Liste mit enumerate. Dies gibt uns den Index jedes Listenelements (idx) und die Zeichenfolge selbst (student).

Dann rufen wir Split auf jeder Zeichenkette auf, um ihren Inhalt zu extrahieren, wobei das erste Element als name gespeichert wird und der Rest als data. Dann konvertieren wir die Strings in data in Floats. Dann berechnen wir den Durchschnitt dieser Floats. Und dann speichern wir den Durchschnitt zurück in den entsprechenden Listeneintrag.

def string_avg_update(L): 
    '''(list of str) -> NoneType 
    Given a list of strings where each string has the format: 
    'name, grade, grade, grade, ...' update the given 
    list of strs to be a list of floats where each item 
    is the average of the corresponding numbers in the 
    string. Note this function does NOT RETURN the list. 
    >>> L = ['Anna, 50, 92, 80', 'Bill, 60, 70', 'Cal, 98.5, 100, 95.5, 98'] 
    >>> string_avg_update(L) 
    >>> L 
    [74.0, 65.0, 98.0] 
    ''' 
    for idx, student in enumerate(L): 
     name, *data = student.split(',') 
     data = [float(u) for u in data] 
     L[idx] = sum(data)/len(data) 

L = ['Anna, 50, 92, 80', 'Bill, 60, 70', 'Cal, 98.5, 100, 95.5, 98'] 
print(L) 

string_avg_update(L) 
print(L) 

Ausgang

['Anna, 50, 92, 80', 'Bill, 60, 70', 'Cal, 98.5, 100, 95.5, 98'] 
[74.0, 65.0, 98.0] 
+0

Was bedeutet "enumerate" – dg123

+0

@ dg123 "enumerate" ... gibt uns den Index von jedes Listenelement ('idx') und die Zeichenfolge selbst (' student') ". Bitte lesen Sie https://docs.python.org/3/library/functions.html#enumerate Und in Zukunft sollten Sie versuchen, die Antwort auf solche Fragen zu finden, indem Sie die Dokumente durchsuchen. Wenn Sie nicht verstehen, was die Dokumente sagen, dann fragen Sie hier und zitieren Sie die Dokumente in Ihrer Frage, damit die Leute wissen, dass Sie nicht nur faul sind. –

+0

Ya, ich werde sicher sein, dass Sie das nächste Mal überprüfen, danke – dg123

0

bereits.

def string_avg_update(lst): 

    for i in range(len(lst[:])): 
     grades = lst[i].split(',')[1:] 
     float_grades = [float(grade) for grade in grades]   
     average = sum(float_grades)/len(float_grades)   
     lst[i] = average 



L = ['Anna, 50, 92, 80', 'Bill, 60, 70', 'Cal, 98.5, 100, 95.5, 98'] 
string_avg_update(L)  

>>> print(L) 
[74.0, 65.0, 98.0] 

Ich weiß enumerate() funktioniert besser dafür.

+1

Die Funktion sollte die Eingabeliste mutieren, nicht eine neue machen. – user2357112

+0

@ user2357112, oh, tut mir leid, ich habe das nicht bemerkt :) Änderte den Code entsprechend. – srig

Verwandte Themen