为了练习如何更流畅地使用字典,我试图编写一个程序,读取月球大气的化学成分,并将元素及其估计成分分配为键值对,如"NEON 20":40000
数据文件如下所示
Estimated Composition (night, particles per cubic cm):
Helium 4 - 40,000 ; Neon 20 - 40,000 ; Hydrogen - 35,000
Argon 40 - 30,000 ; Neon 22 - 5,000 ; Argon 36 - 2,000
Methane - 1000 ; Ammonia - 1000 ; Carbon Dioxide - 1000
到目前为止,我的代码是这样的:
def read_data(filename):
dicti = {}
with open(filename,"r") as infile:
infile.readline()
for line in infile:
words = line.split(";")
dicti[words[0]] = f"{words[1]}"
for key in dicti:
print(key, dicti[key])
read_data("atm_moon.txt")
问题是:
- 如何同时拆分
"-"
和";"
? - 如何从该数据文件中以简单而优雅的方式将元素及其估计的大气成分分配为键值对?
- 如何使元素名称全部大写?
有谁能好心地帮助一个新手吗?欢迎大家帮忙。
这里是一个行列表。每行可以包含多个项目,以分号分隔。每个条目(或记录)由一个元素名称、一个连字符和粒子数组成。
你不需要同时使用不同的分隔符;相反,您可以使用分号分隔出单个项,然后根据连字符将每个项拆分为字典所需的键/值对。
for line in infile:
for item in line.split(" ; "):
key, value = item.split(" - ", 1)
dicti[key.upper()] = value
请注意,我包括了分隔符周围的空格,因此在分割时它们将被删除。否则这些词就会出现在你的字典里。另一种选择是使用strip()
;这样,即使那里有更多(或没有)空格,它也能正常工作。
for line in infile:
for item in line.split(";"):
key, value = item.split("-", 1)
dicti[key.strip().upper()] = value.strip()
然而,如果有任何机会,你的记录之一可能有一个分号或连字符在它的不是意味着一个分隔符,我会在.split()
调用中留下空格。
现在我要更进一步,假设您希望这些值是实际的数字,而不仅仅是字符串。要做到这一点,我们将删除逗号并将其转换为整数。
for line in infile:
for item in line.split(";"):
key, value = item.split("-", 1)
dicti[key.strip().upper()] = int(value.strip().replace(",", ""))
如果有任何带有小数部分(小数点)的值,可以使用float()
代替int()
将其转换为浮点数。
我觉得使用Python REPL来测试它更容易。
$ python
>>> string = """
Estimated Composition (night, particles per cubic cm):
Helium 4 - 40,000 ; Neon 20 - 40,000 ; Hydrogen - 35,000
Argon 40 - 30,000 ; Neon 22 - 5,000 ; Argon 36 - 2,000
Methane - 1000 ; Ammonia - 1000 ; Carbon Dioxide - 1000
"""
>>> lines = string.split('n')
>>> lines
['Estimated Composition (night, particles per cubic cm):', 'Helium 4 - 40,000 ; Neon 20 - 40,000 ; Hydrogen - 35,000', 'Argon 40 - 30,000 ; Neon 22 - 5,000 ; Argon 36 - 2,000', 'Methane - 1000 ; Ammonia - 1000 ; Carbon Dioxide - 1000']
>>> lines[1:]
['Helium 4 - 40,000 ; Neon 20 - 40,000 ; Hydrogen - 35,000', 'Argon 40 - 30,000 ; Neon 22 - 5,000 ; Argon 36 - 2,000', 'Methane - 1000 ; Ammonia - 1000 ; Carbon Dioxide - 1000']
>>> [line.split(' ; ') for line in lines[1:]]
[['Helium 4 - 40,000', 'Neon 20 - 40,000', 'Hydrogen - 35,000'], ['Argon 40 - 30,000', 'Neon 22 - 5,000', 'Argon 36 - 2,000'], ['Methane - 1000', 'Ammonia - 1000', 'Carbon Dioxide - 1000']]
>>> [line.split(' - ') for line in lines[1:] for line in line.split(' ; ')]
[['Helium 4', '40,000'], ['Neon 20', '40,000'], ['Hydrogen', '35,000'], ['Argon 40', '30,000'], ['Neon 22', '5,000'], ['Argon 36', '2,000'], ['Methane', '1000'], ['Ammonia', '1000'], ['Carbon Dioxide', '1000']]
最后,创建具有所需映射的字典对象:
>>> dict([line.split(' - ') for line in lines[1:] for line in line.split(' ; ')])
{'Helium 4': '40,000', 'Neon 20': '40,000', 'Hydrogen': '35,000', 'Argon 40': '30,000', 'Neon 22': '5,000', 'Argon 36': '2,000', 'Methane': '1000', 'Ammonia': '1000', 'Carbon Dioxide': '1000'}
要按需要转换键-值对(即通过大写字典中的所有键并将所有值转换为int
),您可以使用辅助函数来转换键-值对,如下所示:
>>> transform = lambda x, y: (x.upper(), int(y.replace(',', '')))
>>> dict([transform(*name_line.split(' - ')) for line in lines[1:] for name_line in line.split(' ; ')])
{'HELIUM 4': 40000, 'NEON 20': 40000, 'HYDROGEN': 35000, 'ARGON 40': 30000, 'NEON 22': 5000, 'ARGON 36': 2000, 'METHANE': 1000, 'AMMONIA': 1000, 'CARBON DIOXIDE': 1000}
要使用多个分隔符进行分割,可以使用regex:
或者您可以先替换所有分隔符,只保留一种类型,然后使用.split()
我不确定你想如何用它来创建一个字典,但你总是可以循环遍历新创建的列表,并逐个赋值(或使用生成器)。如果您包含字典应该是什么样子,我可以提供一个示例。
将字符串改为大写,使用:
"abc".upper()
# ABC