2017-10-08 17 views
-3

この機能に問題があります。私はそれを実行しようとすると動作しません。 誰でも私がそれを修正するのを助けることができますか?文字列のリストから非型を返す方法は?

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

だから問題は何ですか? – Mureinik

+0

私は[74.0、65.0、98.0]を取得していません。これはdocstringの例から得たいものでした。 – dg123

+1

最初に、これらの文字列を分割してデータを抽出する必要があります。その後、名前の後のものを浮動小数点に変換する必要があります。次に、それらの浮動小数点数について算術演算を行うことができます。結果を適切なリスト項目に保存することができます。それらのことをするいくつかのコードを書こうとしています。 –

答えて

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) 

戻り値:更新後

[74.0, 65.0, 98.0] 

:L通じ

ループとは、カンマがあるLの要素を分割し、新たなリスト、スプリットを作成します。次に、必要に応じて文字列を浮動小数点数に変更します。その後、合計を実行し、浮動小数点平均を計算します。 Lの要素を計算された平均値に設定します。

+0

新しい行の範囲のステートメント? – dg123

+0

私はそれを実行するときに、この1つの名前を取得しますが、私は平均を欲しいだけです – dg123

+0

いいえのzのように書くことができます...コードは私のために働く。あなたの実際のデータはあなたがLで示したものと一致しませんか? – kbball

0

更新

今、私はあなたが(@PM 2Ringの助けを借りて)何をしようとして理解することが、ここでは完全に異なる答えが(問題が実際に私の元の思考よりずっと簡単です)です。あなたはどちらか私のオリジナルの答えや自分自身と他人からの様々な意見に応え、そしてあなたがより明確にやろうとしていたものについて説明している場合には

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

ジップは何を意味しますか?それは何のように? – dg123

+0

[オンラインドキュメント](https://docs.python.org/3/index.html)の[ここをクリック](https://docs.python.org/3/library/functions.html#zip) 。要約すると、2つ以上のリストを取り、その入力引数シーケンスのそれぞれの項目のそれぞれの同じ位置から抽出された要素のグループ(タプル)を生成します( 'yield's)。 '(1、4)'、 '(2、5)'、 '(3、6)'という繰り返し可能な値を返します。成功する。 'list()'コンストラクタコールでそれをラップすると、 '((1,4)、(2,5)、(3、6)]'を含むリストになります。 – martineau

+0

dg123:これは 'zip()'に関するあなたの質問に答えますか?私の答えは正しい結果を生み出していますか?そうでない場合は、質問を編集し、入力値からどのように値が計算されるかを記述してください。 – martineau

0

我々ループenumerateを使用して、リスト上の...役立つだろう。これにより、各リスト項目のインデックス(idx)と文字列自体(student)が得られます。

次に、最初の項目をname、残りをdataと保存して、各文字列を分割して内容を抽出します。次に、dataの文字列を浮動小数点数に変換します。次に、これらのフロートの平均を計算します。そして、平均を適切なリスト項目に戻します。

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) 

出力

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

列挙は何を意味するのですか – dg123

+0

@ dg123 "' enumerate' ...私たちにインデックスを与えます。それぞれのリスト項目( 'idx')と文字列自体(' student') "となります。 https://docs.python.org/3/library/functions.html#enumerateを参照してください。今後、ドキュメントを検索して、そのような質問に対する回答を見つけようとする必要があります。ドキュメントの内容を理解できない場合は、ここで質問してください。そうすれば、怠け者ではないことが人々に分かります。 –

+0

ええと、私は次回にそれをチェックすることを忘れないでください。 – dg123

0

これを試してみてください。

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] 

私が知っているのはenumerate()です。

+1

関数は入力リストを変更する予定であり、新しいものを作成することはできませんでした。 – user2357112

+0

@ user2357112、ああ、申し訳ありませんが、私はそれに気付かなかった:)それに応じてコードを変更しました。 – srig

関連する問題