2016-04-27 201 views
-2

我很困惑我应该拿一个文件,用户输入并在文本文件中取得分数,并将其变成一个列表。列表理解python

我遇到的问题是,当我把它变成一个列表,它给了我一个变量下的三个单独的列表。

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? 2.你试图将它们放入单个列表中的哪个位置? – jonrsharpe

+0

我的尝试是:对于分数线。它只是给了我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) 

最后(也可能是最重要的),你可能只是交换了你的eval使用了intfloat(取决于输入),并你的程序更安全。实际上,eval将在您的机器上运行任何不受信任的代码。为了演示,在你的文本文件中添加一行exit(),注意你的程序在之前退出。攻击者可以使用它来做恶意的事情(比如,如果脚本以足够高的权限运行,则擦除您的主目录,甚至是整个驱动器)。

+2

FWIW,你也可以在'.extend'中放入'']':'scores_list.extend(int(i)for i in line.split())'。 – mgilson

+0

你应该扩展你的意思是“更安全”......一个'exit()'的分数就是一个很好的例子。 – RoadieRich

2

您可以使用这个列表理解为你为什么要使用`eval`(未如`int`)单程

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