我需要帮助解决一个挑战问题。
假设我们已经使用read方法将文件加载到字符串viscosity_data中。viscosity_data包含数据(按gas、C、T_0、mu_0的顺序排列),例如:
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:
mu_data['air']['C'] == 120.0
mu_data['hydrogen']['T_0'] == 293.85
mu_data['sulphur dioxide']['mu_0'] ==12.54到目前为止,我还不知道该从哪里出发:
mu_data = {}
#mu_data master
for data in viscosity_data:
mu_data[name] = viscosity_data发布于 2017-10-14 22:58:34
你可以用dict理解来做这件事:
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
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"))}输出
{'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'}}发布于 2017-10-14 23:01:54
你有一个csv。您应该使用内置的csv模块来解析它:
>>> 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)))
...其结果是:
>>> 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实际上是一个文件,但是您应该使用正常的方法打开文件。
也就是说,你应该做:
>>> 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)))
...发布于 2017-10-14 23:02:00
选项1
使用纯python方法(没有任何外部包)。
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
如果你用熊猫,这真的很容易。如果你没有它,你可以安装它:
pip install pandas
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')https://stackoverflow.com/questions/46750086
复制相似问题