2016-04-27 8 views
-2

私は非常に混乱しています。ユーザーが入力したファイルをテキスト文書のスコアに入れてリストに変換するはずです。理解するpython

問題は私がそれをリストにすると、私は1つの変数の下で3つの別々のリストを与えます。

def main(): 
    file = input("Enter a filename: ") 
    file1 = open(file, "r") 
    Scores = (file1.readlines()) 
    for line in Scores: 
     scores = [eval(i) for i in line.split()] 

     print(scores) 

が、私は出力としてこれを取得:

[34, 34, 54, 14, 32, 24, 31, 34, 53, 74, 22, 29] 
[54, 34, 14, 14, 32, 24, 31, 34, 53, 74, 22, 29] 
[66, 53, 19, 45, 39, 72, 51, 46, 64, 33, 44, 55] 

は、私は助けるが、私はそこにあるどのように多くの得点を表示することができます1つのリスト全体にこれを回す入手してください可能性があり、それらのすべての合計、と平均。

+1

1.このため、リストの内包表記を使用することができますなぜあなたは 'eval'(ない例えば' int')を使用していますか? 2.それらを単一のリストに入れるあなたの試みはどこですか? – jonrsharpe

+0

私の試行は:in line in scoreです。それはちょうど私に3リストを与えると私はそれらを一緒に追加することができるようにそれらの名前を知っていません – user6263406

+0

あなたは* "彼らの名前を知っている"を意味する*? – jonrsharpe

答えて

2

これは、あなたがやりたいことになります。

def main(): 
    file = input("Enter a filename: ") 
    file1 = open(file, "r") 
    Scores = (file1.readlines()) 
    scores_list = [] 
    for line in Scores: 
     scores_list.extend([eval(i) for i in line.split()]) 

    print(scores_list) 

トリックがextendに、ファイル内の各行のためのあなたの新しいリストと既存のリストです。

ここで改善の余地があることに注意してください。あなたは適切にファイルを閉じる管理するためのコンテキストマネージャを使用することができます。

def main(): 
    filename = input("Enter a filename: ") 
    scores_list = [] 
    with open(filename, "r") as file1: 
     for line in file1: 
      scores_list.extend([eval(i) for i in line.split()]) 

    print(scores_list) 
最後に

(そしておそらく最も重要なのは)、あなたはおそらく(入力に応じて)intまたはfloatためevalの使用を交換して作ることができますあなたのプログラムははるかに安全です。つまり、evalはあなたのコンピュータ上で信頼できないコードを実行します。デモを行うには、テキストファイルにexit()という行を追加して、のいずれかがになる前にプログラムが終了することに注意してください。攻撃者はこれを悪意のあるものを実行するために使用することができます(スクリプトが十分な許可で実行されている場合は、ホームディレクトリまたはドライブ全体をワイプするなど)。

+2

FWIWでは、 '.extend':' scores_list.extend(line.split())のiのためのint(i) 'に' [] 'をドロップすることもできます。 – mgilson

+0

あなたはおそらく "より安全"という意味に拡張するべきです... exit()のスコアは良い例です。 – RoadieRich

2

あなたは一つの方法として

file = input("Enter a filename: ") 
with open(file, "r") as f: 
    lines = f.readlines() 
    scores = [int(i) for line in lines for i in line.split()] 
    print(scores) 
+1

OPが空白で分割したいと思うようですが、 ''、' ' – mgilson