Python中的映射函数
列出玩家在特定游戏中表现的scores.txt文件内容: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',
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