2017-10-11 3 views
0

私は本当にPythonコードを作るのに苦労しています。どんな助けも非常に高く評価されるでしょう。私がコードを書くために必要な関数は以下の通りです。数字は入力の文字列なので、私は何とか生徒の名前で分けることができないことを知っています。何とか数字をint/floatに変換して、どういうわけかリストを名前でサブリストに分ける必要があると思います。 )しかし、私はこれを達成する方法を知らない。私はmap(int、)を使ってintに変換できますが、動作していないと思われます。ありがとう!文字列のみのリストを文字列と浮動小数点のサブリストに変換する

コード:

def string_list(L): 

    '''(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), grade, grade, grade, ...] where the name 
    is a string and the grades are floats. 
    >>> string_list(['Joe, 60, 90, 80', 'Harry, 60, 70', 'Jill, 98.5, 100, 95.5, 98']) 
    [['Joe', 60.0, 90.0, 80.0], ['Harry', 60.0, 70.0], ['Jill', 98.5, 100.0, 95.5, 98.0]] 
    ''' 
+1

を問題を打破するために試してみてください。名前と成績の両方を含む大きな文字列が与えられます。どのようにそれらの部分を分けることができますか? (ヒント:入力文字列のフォーマットを見てください!) – bnaecker

+0

チップをありがとう!それぞれの人の名前はグレードごとに個別の文字列ですので、どういうわけかそれらの文字列をそれぞれ分割して数字をintからintに変換できるかどうかを確認します。 – Rir8

+0

楽しく(そして、私たちがPythonでどれくらい簡単にそれを持っているかを思い出させるために)私は[Haskellでこれを実装しました](https://gist.github.com/NotTheEconomist/6e129c9f015d39100ccaa4079f140f64)。公平であるために、私は 'DataText'パッケージに存在する' splitOn'と 'strip'を再実装しました。私は輸入品を持たないことを意図していましたが、 'Data.Char(isSpace)の定義は...面倒でした。 –

答えて

0
def string_list(L): 
    final_list = [] 
    for element in L: 
     new_entry = element.split(',') # Split on commas; returns a list of strings 
     new_entry = [x.strip() for x in new_entry] # Remove whitespace from each string in list 
     new_entry[1:] = [float(x) for x in new_entry[1:]] # Cast all entries but the first to float 
     final_list.append(new_entry) 
    return final_list 
+0

コードをよく読んでくれてありがとう、それぞれの行が何をしているかについて#コメントを追加して、何が起こっているのか知っています。私はこれを試してみよう! – Rir8

+0

コードを再度ありがとう! element.split( '、')を書くと、文字列のコンマで区切られているのはなぜですか?文字列が不変なので、文字列のコンマで分割することも可能ですか?第二に、「要素」という言葉を使用すると、他の単語が使用されている可能性がありますか?これをテストするには要素の代わりにelxmentを置いて、それでもまだこの平均要素はどんな言葉でもかまいませんか?それが何を意味するのかは、正確には何を意味するのでしょうか?それ以外は、私は残りの感謝を理解する! – Rir8

+0

文字列のコンマで区切っています。 「要素」は元のリストの1つの要素です。 'ジョー、60、90、80 '。 'element.split( '、')'は文字列のリストを返しますが、それには空白が含まれます。したがって、 'strip'コマンドが追加されます。私はそれをより明確にするために、「分割」と「ストリップ」を2つの行に分けました。 –

0

ソリューション

onelinerリスト内包表記魔法を愛するように手に入れました!

[[float(val) if val.strip().isdigit() else val.strip() for val in person.split(',')] for person in L] 

同じリスト内包が、狭い画面用:

def string_list(L): 
    return [[float(val) if val.strip().isdigit() else val.strip() for val in person.split(',')] for person in L] 

そして、それを使用する:あなたがそうのようなあなたの関数に平手打ちことができ

[[float(val) if val.strip().isdigit() else val.strip() 
     for val in person.split(',')] 
     for person in L ] 

使用

ように:

>>> L = ["Joe, 60, 90, 80", "Harry, 60, 70", "Jill, 98.5, 100, 95.5, 98"] 
>>> string_list(L) 
[['Joe', 60.0, 90.0, 80.0], 
['Harry', 60.0, 70.0], 
['Jill', '98.5', 100.0, '95.5', 98.0]] 

内訳

リストの内包表記は素晴らしいが、醜いです!それでは、それに対応する部分に、この巨獣を分解してみましょう:私たちのリストの各項目(例えば"Joe, 60, 90, 80")については

for person in L] 

for val in person.split(',') 

我々はそのような "Joe, 60, 90, 80"その文字列のリストにこれらの文字列のそれぞれを分割した場合 - >["Joe","60","90","80"]とし、それぞれの値を格納する要素("Joe"または"60"など)の上に繰り返しを格納します。val

float(val) if val.strip().isdigit() else val.strip() 

valは数字文字(.isdigit())のみで構成されている場合は、floatに変換します。そうでない場合は、それらなしであなたは文字列のみの単一のリストを取得し、インナーブラケットグループに

[[<code> for val in person.<more>] for person in L] 

.strip()経由スペースなどの空白文字なし)人物の要素を文字列を返します。

あなたがそうのようなfor <thing> in <list>年代の順序を変更する必要がある単一のリストたい場合:

[float(val) if val.strip().isdigit() else val.strip() 
    for person in L 
    for val in person.split(',') ] 
+0

コードと優れた内訳ありがとうございました! – Rir8

+1

ありがとう!故障は実際に私が作ったやり方とは逆なので、私は自分の働きを見せると思った。ちょっとした注意書きですが、1つのライナーは素晴らしいですが、長期的(時間的に)のコードでは持続可能ではありません。プロダクションコードでは、パフォーマンスの向上が(デバッグするための)複雑さを乗り越えていることを確かめたいと思うでしょう。 – Splatmistro

関連する問題