2017-10-12 8 views
0

この関数を正しく作成するためにいくつか試してみましたが、何も試みていないようです。私は何をすべきかというアイデアは多少あると思いますが、どうやってそれをしようとしているのかは分かりません。だから私はすでにstring_avg(L)という機能を持っています。私はこの機能に使うことができると思います。 string_avg(L)は、次のコードで定義されます。各サブリスト内の関数/メソッドを適用します。サブリスト全体のリストではなく、Pythonで全体を表します。

 '''(list of str) -> list of list 
    Given a list of strings where each string has the format: 
    'name, grade, grade, grade, ...' return a new list of 
    lists where each inner list has the format : 
[name (str), average grade (float)] 
Requirement: This function should be 1 line long. 
>>> string_avg(['Jo, 92, 80', 'Bill, 60, 70', 'Cal, 98.5, 100, 95.5, 98']) 
[['Jo', 86.0], ['Bill', 65.0], ['Cal', 98.0]] 
''' 

しかし、今、私は次のコードを記述する必要があります。

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 = ['Jo, 50, 92, 80', 'Bill, 60, 70', 'Cal, 98.5, 100, 95.5, 98'] 
>>> string_avg_update(L) 
>>> L 
[89.0, 65.0, 98.0] 
''' 

のでstring_avg_update(L)を取得するには、Iのけれどもおそらくstring_avg(L)を使用して、[['' Jo '、86.0]、[' Bill '、65.0]、[' Cal '、98.0]]を作成し、各サブリストから名前を削除し、各リストから1つのリストへのintです。これを行う方法はありますか?リストの最初の文字を削除する方法はわかりませんが、list.pop()はリストの最後の文字を削除するので、list.reverse()を使用して各サブリスト内の最初の数字を配置すると、可能であれば、サブリストを一緒に結合します。ただし、list.reverseを使用すると、各サブリスト内の項目を逆順にする代わりに、サブリストの順序が逆転します(つまり、最初の項目が最初に表示されます)。 list.pop()を使うことができるように各リストが逆転されるようにする方法はありますか(各サブリストでどのように使用するかを理解できれば)。

リストから文字列だけを削除する方法があるので、すべてのサブリストに参加して名前を削除することができます。 またはの場合は、各サブリストから名前を削除するためにdelを使用することになりますが(del list [0]を使用して)、再度使用するとdelを各サブリストに渡す方法がわかりませんdel list [0]として、各サブリストの最初の文字ではない最初のサブリストを削除します。

ここで重要なのは、サブリストにリストとしてではなく、個々のサブリストに関数/メソッドを適用する方法です。

ありがとうございます!

+0

これはdictionnary noを使用するのに最適な場所のようですか? – Tissuebox

+0

あなたはここでリストの理解について考えるべきです。いずれかの*リストから2番目の要素(グレード)を選択する方法について考えてみましょう: 'L [1]'でしょうか?ですから、どのように*すべての*サブリストからその要素を選択できますか? – bnaecker

+0

私はそれが私の質問だと思う..もし私が "Lのサブリスト"を使うなら、L [1]を選択するか、L [0]を削除するだけのことについて何かを書きますか? – Rir8

答えて

0

ディクショナリは、達成しようとしているもののより優れたデータ構造です。名前の平均値を得るためにまず

def av_grade(lst): 
    """(list of str)->list of list 
    Given a list of strings where each string has the format: 
    'name, grade, grade, grade, ...' return a new list of 
    lists where each inner list has the format : 
    [name (str), average grade (float)] 
    Requirement: This function should be 1 line long. 

    >>> avg_grade(['Jo, 92, 80', 'Bill, 60, 70', 'Cal, 98.5, 100, 95.5, 98']) 
    [['Jo', 86.0], ['Bill', 65.0], ['Cal', 98.0]] 
    """ 
    return [[x.split()[0], sum(map(float, x.split()[1:]))/(len(x.split()) - 1)] for x in ";".join(lst).replace(",", "").split(";")] 

は今だけ平均値のフラットリストを取得する は、しかし、ここでリストに機能するソリューションと1行の制限です

def av_grade_update(lst): 
    """(list of str)->[float, float, ...] 
    Given a list of strings where each string has the format: 
    'name, grade, grade, grade, ...' return a new with the format : 
    [average grade (float), average grade (float)] 
    Requirement: This function should be 1 line long. 

    >>> avg_grade_update(['Jo, 92, 80', 'Bill, 60, 70', 'Cal, 98.5, 100, 95.5, 98']) 
    [86.0, 65.0, 98.0] 
    """ 
    return [sum(map(float, x.split()[1:]))/(len(x.split()) - 1) for x in ";".join(lst).replace(",", "").split(";")] 

両方の機能が元のリストで機能することに注意してください。これは元のリストを突然変異させないようにするためです。オリジナルの情報が元の方法で変更されると、元の情報は不可逆的に失われます(少なくともプログラム内で)。

関連する問題