【问题标题】:map function in PythonPython中的映射函数
【发布时间】:2017-10-21 19:57:22
【问题描述】:

文件 score.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 来说非常陌生。 我可以修复代码吗?

【问题讨论】:

  • “导致错误消息”您想与我们分享它们吗?
  • 你应该使用with open('scores.txt', 'r')

标签: python python-3.x mapping


【解决方案1】:

看来您已经调整了 python2.x 代码以在 python3.x 中使用。请注意,map 在 python3.x 中不返回列表,它返回一个 generator 映射对象(基本上不是列表),您必须将其转换为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 循环。

numbers = [float(x) for line in f for x in line.rstrip().split(',')]

另外,忘记提及这一点(感谢chris in the comments),但您确实应该使用上下文管理器来处理文件 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

【讨论】:

  • @Coldspeed:感谢您的回复。我尝试了您的代码,但它们都产生相同的错误“ValueError:无法将字符串转换为浮点数:”。我会从“with open('scores.txt', 'r') as f:”开始,然后写下你的第一个代码建议。我做错了什么?
  • @Lola 您的数据有问题 - 文本文件的格式和处理它的代码不同步。这个答案假设您在阅读文件时知道自己在做什么。如果你不知道如何阅读你的文件,那么你就会遇到一个完全不同的问题。
  • @Coldspeed:然后,我在阅读文件时不知道自己在做什么。我在专门用于读取文件的类部分中获得了代码。我想,你的代码正是为了让一个对象“数字”代表数据。我弄错了吗?你能帮帮我吗?我所需要的只是能够将文本文件读入 Python。
  • @Lola 好的。你的数据有问题,所以我添加了一个处理错误的方法。如果可行,请不要忘记投票并接受。谢谢。
  • @Lola x = line.rstrip() 删除尾随空格。 y = x.split(',') 生成一个列表。 z = map(float, y) 将浮点函数应用于 y 中的每个元素。 k = list(z) 将生成的地图对象转换为列表。 numbers.extend(k) 然后会将 k 中的所有元素添加到 numbers。不幸的是,这不起作用,因为它是一段脆弱的代码,无法处理 y 中的无效元素。例如,float('blah blah') 是一个无效的操作,这一行无法理解。
猜你喜欢
  • 2020-03-17
  • 1970-01-01
  • 2013-09-26
  • 2022-12-17
  • 2011-08-04
  • 2023-01-30
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多