Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的映射函数_Python_Python 3.x_Mapping - Fatal编程技术网

Python中的映射函数

Python中的映射函数,python,python-3.x,mapping,Python,Python 3.x,Mapping,列出玩家在特定游戏中表现的scores.txt文件内容: 80,55,16,26,37,62,49,13,28,56 43,45,47,63,43,65,10,52,30,18 63,71,69,24,54,29,79,83,38,56 46,42,39,14,47,40,72,43,57,47 61,49,65,31,79,62,9,90,65,44 10,28,16,6,61,72,78,55,54,48 下面的程序读取文件并将分数存储到列表中 f = open('scores.txt',

列出玩家在特定游戏中表现的scores.txt文件内容:

80,55,16,26,37,62,49,13,28,56
43,45,47,63,43,65,10,52,30,18
63,71,69,24,54,29,79,83,38,56
46,42,39,14,47,40,72,43,57,47
61,49,65,31,79,62,9,90,65,44
10,28,16,6,61,72,78,55,54,48
下面的程序读取文件并将分数存储到列表中

f = open('scores.txt','r')
L = []
for line in f:
    L = L + map(float,str.split(line[:-1],','))
print(L)
但它会导致错误消息。我在课堂上看到的代码非常混乱,对Pyton来说非常陌生。
我可以修复代码吗?

看来您已经修改了python2.x代码以在python3.x中使用。请注意,
map
在python3.x中不返回列表,它返回一个生成器映射对象(基本上不是列表),您必须将其适当地转换为
list

此外,我建议使用
list.extend
,而不是将两者相加。为什么?前者在每次执行加法时都会创建一个新的列表对象,在时间和空间上都很浪费

numbers = []
for line in f:
    numbers.extend(list(map(float, line.rstrip().split(','))))

print(numbers)
另一种方法是:

for line in f:
    numbers.extend([float(x) for x in line.rstrip().split(',')]) 
这恰好更具可读性。您还可以选择使用嵌套列表来摆脱外部
for
循环


另外,忘了提到这一点(感谢),但您确实应该使用上下文管理器来处理文件I/O

with open('scores.txt', 'r') as f:
    ...
它更干净,因为当你处理完文件后,它会自动关闭你的文件


在看到您的
ValueError
消息后,很明显您的数据存在问题(无效字符等)。让我们试试更具攻击性的东西

numbers = []
with open('scores.txt', 'r') as f:
    for line in f:
        for x in line.strip().split(','):
            try:
                numbers.append(float(x.strip()))
            except ValueError:
                pass
如果这一点都不起作用,也许,使用正则表达式进行更激进的操作可能会起作用:

import re

numbers = []
with open('scores.txt', 'r') as f:
    for line in f:
        line = re.sub('[^\d\s,.+-]', '', line)
        ... # the rest remains the same

“导致错误消息”您是否愿意与我们共享这些消息?您应该将
与open('scores.txt','r')
@Coldspeed一起使用。谢谢您的回复。我尝试了您的代码,但所有代码都会产生相同的错误“ValueError:无法将字符串转换为float:”。我会以“with open('scores.txt',r')作为f:”开头,然后写,例如,您的第一个代码建议。我做错了什么?@Lola你的数据有问题-文本文件的格式和处理它的代码不同步。这个答案假设您在读取文件时知道自己在做什么。如果你不知道如何读取文件,那么你就有一个完全不同的问题。@Coldspeed:那么,当我读取文件时,我不知道自己在做什么。我在课堂上得到了专门用来阅读文件的代码。我想,你的代码应该有一个代表数据的对象“数字”。我弄错了吗?你能帮帮我吗?我所需要的就是能够将文本文件读入Python。@Lola好的。您的数据存在问题,因此我添加了一个方法来处理错误。如果有效,别忘了投票和接受。谢谢。@Lola x=line.rstrip()删除尾随空格。y=x。拆分(',')生成一个列表。z=map(float,y)将对y中的每个元素应用float函数。k=list(z)将结果贴图对象转换为列表。然后,extend(k)将k中的所有元素添加到数字中。不幸的是,这不起作用,因为它是一段脆弱的代码,无法处理y中的无效元素。例如,float('blah-blah')是一个无效的操作,这一行不能在上面提取。
import re

numbers = []
with open('scores.txt', 'r') as f:
    for line in f:
        line = re.sub('[^\d\s,.+-]', '', line)
        ... # the rest remains the same