python - 在Python中将值列表传递到字典中
问题描述
我有一个包含名称和数字列表的 .txt 文档,并试图将它们传递到键/值对中的字典中。值列表看起来像这样(它是键/值对的垂直列表,其间有 \n 新行):
文件名:“demo.txt” 内容:
Brandon: 115.5
James: 128.87
Joel:
Luke:
Sarah: 827.43
Brandon: 100
Jimmy: xyz
Sue: -153
Sue: 100
Fred: x1y2
This
Should
Not
Get
Included
// 对于空格和非数字值,我试图跳过它们——否则,如果字典中已经存在该名称,我想更新该值。我已经尝试了以下方法,但希望得到一些建议:
d = {}
lst = []
f = open("demo.txt", "r")
lines = f.readlines()
f.close()
for line in lines:
lst.append(line.strip().split())
for i in lst:
if len(i) < 2:
lst.remove(i)
else:
continue
for i in lst:
try:
i[0] = i[0][:-1]
except:
lst.remove(i)
for i in lst:
try:
if len(i) < 2:
lst.remove(i)
else:
i[1] = float(i[1])
except:
lst.remove(i)
for i in lst:
key = i[0]
value = float(i[1])
if key in d:
existing_value = d.get(key)
value = float(existing_value) + float(value)
d.update({key: value})
else:
d[key] = value
print(d)
解决方案
我会做这样的事情:
d = {}
for line in open("demo.txt"):
if ':' in line:
key, value = line.split(":")
try:
d[key] = float(value.strip())
except ValueError:
pass
它会跳过任何没有:
字符的行。否则,它将该行拆分为一个键(在 之前:
)和一个值(在 之后:
),并尝试将值转换为浮点数。如果失败,它会继续下一行。如果成功,它要么在字典中创建一个新密钥,要么更新现有密钥。
在建议方面,有几点说明:
- 您使用空白
except
而不指定要捕获的错误类型。这是不好的做法。您通常应该只捕获您期望的错误类型。至少,except Exception
它会捕获几乎所有异常,但会忽略由您不想捕获的事物引起的异常,例如终止信号 - 您不需要将每一行读入内存,关闭文件,然后处理它。您可以在阅读时对其进行处理。这在这里并没有太大的区别,但是如果你有一个很大的文件,你可能没有足够的 RAM 来将整个东西放入 RAM
- 打开要读取的文件时,最好使用上下文管理器
with open('demo.txt') as f: f.readline()
,或者像我一样使用循环,这样您就不必担心以后要记住关闭文件-它会自动关闭 - 我认为您的代码最重要的是它非常冗长。Python 的强大功能使您可以以更短、更易读的方式完成您想做的事情。如果您需要在几个月后的某个时间点返回并阅读您的代码,您可能需要几分钟才能弄清楚它在做什么。更短的代码更容易阅读(只要它不仅仅是为了简短而简短,以至于难以阅读)
推荐阅读
- javascript - 使用 Office Addin 更改 MS Word 中的主菜单
- datetime - 在 SpringBoot 中处理 LocalDate
- java - Android登录注册:无法使用凌空将数据插入数据库
- django - 在 Django 中注释外键字段
- css - 在背景图像上定位元素
- python - 使用 Python 播放、暂停等 Spotify Web Playback SDK
- javascript - 如何更改 inputElement javascript?
- appium - 如何在 Appium 中使用 WindowsDriver 等待元素加载后再单击它
- postgresql - 为 postgresql 选择免费的 Olap 服务器
- google-app-maker - Google App Maker Total 字段