首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在为字典赋值时拆分多个不同的分隔符

如何在为字典赋值时拆分多个不同的分隔符
EN

Stack Overflow用户
提问于 2021-10-18 18:31:57
回答 3查看 96关注 0票数 0

为了练习如何更流畅地使用字典,我试图编写一个程序,读取月球大气的化学成分,并将元素及其估计组成作为像这个"NEON 20":40000这样的键值对来分配。

数据文件看起来像这个

代码语言:javascript
运行
复制
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

到目前为止,和我的代码如下所示:

代码语言:javascript
运行
复制
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")

我的问题是:

如何在";"

  • How和上拆分元素和估计的大气成分,从这个数据文件中以一种简单而优雅的方式将元素及其估计的大气成分分配为键值对?
  • ,如何使元素名都是大写?

有谁能帮助新手吗?欢迎所有的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-18 18:42:23

你这里有一串台词。每一行可以包含多个项,用分号分隔。每个项目(或记录)由一个元素名称、一个连字符和粒子计数组成。

这里不需要同时在不同的分隔符上拆分;相反,您可以使用分号将单个项拆分,然后根据连字符将每个项拆分为字典所需的键/值对。

代码语言:javascript
运行
复制
for line in infile:
    for item in line.split(" ; "):
        key, value = item.split(" - ", 1)
        dicti[key.upper()] = value

请注意,我包括了分隔符周围的空格,所以在拆分时会删除它们。否则这些都会在你的字典里结束。另一种选择是使用strip();这样即使有更多(或没有)空间,它也能正常工作。

代码语言:javascript
运行
复制
for line in infile:
    for item in line.split(";"):
        key, value = item.split("-", 1)
        dicti[key.strip().upper()] = value.strip()

但是,如果您的记录中可能有分号或连字符而不是分隔符,我将保留.split()调用中的空格。

现在,我将更进一步,假设您需要这些值作为实际数字,而不仅仅是字符串。要做到这一点,我们将删除逗号并将它们转换为整数。

代码语言:javascript
运行
复制
for line in infile:
    for item in line.split(";"):
        key, value = item.split("-", 1)
        dicti[key.strip().upper()] = int(value.strip().replace(",", ""))

如果有任何小数部分(小数点)的值,您可以使用float()代替int()将这些值转换为浮点数。

票数 3
EN

Stack Overflow用户

发布于 2021-10-18 18:41:01

我觉得使用Python测试它更容易一些。

代码语言:javascript
运行
复制
$ 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']]\

最后,创建具有所需映射的字典对象:

代码语言:javascript
运行
复制
>>> 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),您可以使用辅助函数来转换键值对,如下所示:

代码语言:javascript
运行
复制
>>> 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}
票数 2
EN

Stack Overflow用户

发布于 2021-10-18 18:39:21

要被多个分隔符拆分,有regex:Split Strings into words with multiple word boundary delimiters

或者,您可以首先替换所有分隔符以只保留一种类型,然后使用.split()

我不知道您想如何用它来做字典,但是您总是可以循环遍历新创建的列表,然后一个一个地分配它(或者使用生成器)。如果你包括字典应该是什么样子,我可以提供一个例子。

若要将字符串更改为大写,请使用:

代码语言:javascript
运行
复制
"abc".upper()
# ABC
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69620884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档