首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从文件中创建嵌套字典

从文件中创建嵌套字典
EN

Stack Overflow用户
提问于 2017-10-14 22:52:09
回答 5查看 2K关注 0票数 2

我需要帮助解决一个挑战问题。

假设我们已经使用read方法将文件加载到字符串viscosity_data中。viscosity_data包含数据(按gas、C、T_0、mu_0的顺序排列),例如:

代码语言:javascript
复制
viscosity_data = '''air,120,291.15,18.27
nitrogen,111,300.55,17.81
oxygen,127,292.25,20.18
carbon dioxide,240,293.15,14.8
carbon monoxide,118,288.15,17.2
hydrogen,72,293.85,8.76
ammonia,370,293.15,9.82
sulphur dioxide,416,293.65,12.54'''

将字符串viscosity_data中的数据转换为嵌套的字典mu_data,这样我们就可以查找C、T0和μ0中的一个名为mu_dataname的气体,其中X可以是'C‘、'T_0’或'mu_0‘之一。mu_data中的数值应该都是浮动的。

例如,以下语句应该是True:

代码语言:javascript
复制
mu_data['air']['C'] == 120.0
mu_data['hydrogen']['T_0'] == 293.85
mu_data['sulphur dioxide']['mu_0'] ==12.54

到目前为止,我还不知道该从哪里出发:

代码语言:javascript
复制
mu_data = {}
#mu_data master
for data in viscosity_data:
    mu_data[name] = viscosity_data
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-10-14 22:58:34

你可以用dict理解来做这件事:

代码语言:javascript
复制
viscosity_data = '''air,120,291.15,18.27
nitrogen,111,300.55,17.81
oxygen,127,292.25,20.18
carbon dioxide,240,293.15,14.8
carbon monoxide,118,288.15,17.2
hydrogen,72,293.85,8.76
ammonia,370,293.15,9.82
sulphur dioxide,416,293.65,12.54'''

viscosity_data = [air_data.split(",") for air_data in viscosity_data.split("\n")]
mu_data = {air_name:{"c": c, "T_0": T_0, "mu_0": mu_0} for air_name,c,T_0,mu_0 in viscosity_data}

或者简单地在一行中使用map

代码语言:javascript
复制
mu_data = {air_name:{"c": c, "T_0": T_0, "mu_0": mu_0} for air_name,c,T_0,mu_0 
           in map(lambda x: x.split(","), viscosity_data.split("\n"))}

输出

代码语言:javascript
复制
{'air': {'T_0': '291.15', 'c': '120', 'mu_0': '18.27'},
 'ammonia': {'T_0': '293.15', 'c': '370', 'mu_0': '9.82'},
 'carbon dioxide': {'T_0': '293.15', 'c': '240', 'mu_0': '14.8'},
 'carbon monoxide': {'T_0': '288.15', 'c': '118', 'mu_0': '17.2'},
 'hydrogen': {'T_0': '293.85', 'c': '72', 'mu_0': '8.76'},
 'nitrogen': {'T_0': '300.55', 'c': '111', 'mu_0': '17.81'},
 'oxygen': {'T_0': '292.25', 'c': '127', 'mu_0': '20.18'},
 'sulphur dioxide': {'T_0': '293.65', 'c': '416', 'mu_0': '12.54'}}
票数 -1
EN

Stack Overflow用户

发布于 2017-10-14 23:01:54

你有一个csv。您应该使用内置的csv模块来解析它:

代码语言:javascript
复制
>>> with io.StringIO(viscosity_data) as f:
...     reader = csv.reader(f)
...     names = 'C','T_0','mu_0'
...     data = {}
...     for gas, *rest in reader:
...         data[gas] = dict(zip(names, map(float,rest)))
...

其结果是:

代码语言:javascript
复制
>>> from pprint import pprint
>>> pprint(data)
{'air': {'C': 120.0, 'T_0': 291.15, 'mu_0': 18.27},
 'ammonia': {'C': 370.0, 'T_0': 293.15, 'mu_0': 9.82},
 'carbon dioxide': {'C': 240.0, 'T_0': 293.15, 'mu_0': 14.8},
 'carbon monoxide': {'C': 118.0, 'T_0': 288.15, 'mu_0': 17.2},
 'hydrogen': {'C': 72.0, 'T_0': 293.85, 'mu_0': 8.76},
 'nitrogen': {'C': 111.0, 'T_0': 300.55, 'mu_0': 17.81},
 'oxygen': {'C': 127.0, 'T_0': 292.25, 'mu_0': 20.18},
 'sulphur dioxide': {'C': 416.0, 'T_0': 293.65, 'mu_0': 12.54}}
>>>

注意,我使用io.StringIO(viscosity_data)来假装字符串viscosity_data实际上是一个文件,但是您应该使用正常的方法打开文件。

也就是说,你应该做:

代码语言:javascript
复制
>>> with opn("my_file.txt") as f:
...     reader = csv.reader(f)
...     names = 'C','T_0','mu_0'
...     data = {}
...     for gas, *rest in reader:
...         data[gas] = dict(zip(names, map(float,rest)))
...
票数 2
EN

Stack Overflow用户

发布于 2017-10-14 23:02:00

选项1

使用纯python方法(没有任何外部包)。

代码语言:javascript
复制
data = {}
names = ['C', 'T_0', 'mu_0']
for line in viscosity_data.splitlines():
    i, *j  = line.split(',')
    data[i] = dict(zip(names, j))

选项2

使用pandas

如果你用熊猫,这真的很容易。如果你没有它,你可以安装它:

代码语言:javascript
复制
pip install pandas

代码语言:javascript
复制
import pandas as pd
import io

df = pd.read_csv(io.StringIO(viscosity_data), 
            header=None, names=['gas', 'C', 'T_0', 'mu_0'])
data = df.set_index('gas').to_dict('i')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46750086

复制
相关文章

相似问题

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