如何将字符串附加到与字典并行的列表中
How to append a string into a list in parallel with a dictionary
我正在导入一个文本文件,该文件将行星与它们的状态相关联,True - 对于行星,或者 False - 对于矮人,其顺序必须与下面的字典键相同。
这是名为 "sol" 的字典:
{'Uranus': [2750, 3000, 2880], 'Mercury': [46, 70, 57], 'Earth': [147, 152, 150], 'Venus': [107, 109, 108], 'Mars': [205, 249, 228], 'Saturn': [1350, 1510, 1430], 'Jupiter': [741, 817 , 779], 'Neptune': [4450, 4550, 4500], 'Pluto': [4440, 7380, 5910]}
这是我要导入的数据文件 status1.dat:
Mars,True
Mercury,True
Neptune,True
Uranus,True
Earth,True
Venus,True
Pluto,False
Jupiter,True
Saturn,True
所以在下面的代码中,我被告知不要使用 CSV,只需使用标准循环,我的逻辑让我打开数据文件。拆分线,以便我可以将行星名称 "li[0]" 与 sol[key] 相匹配。如果它们确实匹配,则将状态 "li[1]" 附加到列表的末尾。当然,这是按照数据文件的顺序进行的,而不是字典键。有没有办法改变下面的代码使状态与键一致?还是必须先放字典键循环?
status =[]
def load_status(sol, status):
with open(status1.dat, "r") as s:
for line in s:
line = line.rstrip('\n')
if len(line) > 0:
li = line.split(',')
for key in sol:
if key == li[0]:
status.append(li[1])
print(status)
Print(status) 现在按照数据文件的顺序给出,如下所示:
['True', 'True', 'True', 'True', 'True', 'True', 'False', 'True', 'True']
列表的正确顺序是:
['True', 'True', 'True', 'True', 'True', 'True', 'True', 'True', 'False']
尽量减少对代码的更改
def load_status(sol):
with open('status1.dat', "r") as s:
for line in s:
line = line.rstrip('\n')
if len(line) > 0:
k, v = line.split(',') # get key, value from line
if k in sol: # if key in dictionary
sol[k].append(v) # append value to did entry
# Create status (looping in same order as keys)
# based upon last item in list i.e. v[-1]
status = [v[-1] for k, v in sol.items()]
return sol, status
测试
new_sol, status = load_stats(sol)
print(status)
from pprint import pprint
pprint(new_sol) # pretty print dictionary
输出
['True', 'True', 'True', 'True', 'True', 'True', 'True', 'True', 'False']
{'Earth': [147, 152, 150, 'True'],
'Jupiter': [741, 817, 779, 'True'],
'Mars': [205, 249, 228, 'True'],
'Mercury': [46, 70, 57, 'True'],
'Neptune': [4450, 4550, 4500, 'True'],
'Pluto': [4440, 7380, 5910, 'False'],
'Saturn': [1350, 1510, 1430, 'True'],
'Uranus': [2750, 3000, 2880, 'True'],
'Venus': [107, 109, 108, 'True']}
附录
创建状态而不修改sol
def load_status(sol):
with open('status1.dat', "r") as s:
# create a lookup table for each sol key
sol_key_index = {k:i for i, k in enumerate(sol.keys())}
# Make status array the size of the keys
status = [0] * len(sol.keys())
for line in s:
line = line.rstrip('\n')
if len(line) > 0:
k, v = line.split(',') # get key, value from line
if k in sol: # if key in dictionary
status[sol_key_index[k]] = v # append value to status
return status
用法
status = load_status(sol)
输出
['True', 'True', 'True', 'True', 'True', 'True', 'True', 'True', 'False']
您可以通过首先将文件解析为字典,然后遍历 sol 键并检查解析后的字典中的值来实现所需的顺序。
def load_status(sol):
with open(status1.dat, "r") as s:
stat_dc = {i.split(",")[0]: i.split(",")[1] for i in s.split("\n")
status = [stat_dc[i] for i in sol]
print(status)
输出
['True', 'True', 'True', 'True', 'True', 'True', 'True', 'True', 'False']
我正在导入一个文本文件,该文件将行星与它们的状态相关联,True - 对于行星,或者 False - 对于矮人,其顺序必须与下面的字典键相同。
这是名为 "sol" 的字典:
{'Uranus': [2750, 3000, 2880], 'Mercury': [46, 70, 57], 'Earth': [147, 152, 150], 'Venus': [107, 109, 108], 'Mars': [205, 249, 228], 'Saturn': [1350, 1510, 1430], 'Jupiter': [741, 817 , 779], 'Neptune': [4450, 4550, 4500], 'Pluto': [4440, 7380, 5910]}
这是我要导入的数据文件 status1.dat:
Mars,True
Mercury,True
Neptune,True
Uranus,True
Earth,True
Venus,True
Pluto,False
Jupiter,True
Saturn,True
所以在下面的代码中,我被告知不要使用 CSV,只需使用标准循环,我的逻辑让我打开数据文件。拆分线,以便我可以将行星名称 "li[0]" 与 sol[key] 相匹配。如果它们确实匹配,则将状态 "li[1]" 附加到列表的末尾。当然,这是按照数据文件的顺序进行的,而不是字典键。有没有办法改变下面的代码使状态与键一致?还是必须先放字典键循环?
status =[]
def load_status(sol, status):
with open(status1.dat, "r") as s:
for line in s:
line = line.rstrip('\n')
if len(line) > 0:
li = line.split(',')
for key in sol:
if key == li[0]:
status.append(li[1])
print(status)
Print(status) 现在按照数据文件的顺序给出,如下所示:
['True', 'True', 'True', 'True', 'True', 'True', 'False', 'True', 'True']
列表的正确顺序是:
['True', 'True', 'True', 'True', 'True', 'True', 'True', 'True', 'False']
尽量减少对代码的更改
def load_status(sol):
with open('status1.dat', "r") as s:
for line in s:
line = line.rstrip('\n')
if len(line) > 0:
k, v = line.split(',') # get key, value from line
if k in sol: # if key in dictionary
sol[k].append(v) # append value to did entry
# Create status (looping in same order as keys)
# based upon last item in list i.e. v[-1]
status = [v[-1] for k, v in sol.items()]
return sol, status
测试
new_sol, status = load_stats(sol)
print(status)
from pprint import pprint
pprint(new_sol) # pretty print dictionary
输出
['True', 'True', 'True', 'True', 'True', 'True', 'True', 'True', 'False']
{'Earth': [147, 152, 150, 'True'],
'Jupiter': [741, 817, 779, 'True'],
'Mars': [205, 249, 228, 'True'],
'Mercury': [46, 70, 57, 'True'],
'Neptune': [4450, 4550, 4500, 'True'],
'Pluto': [4440, 7380, 5910, 'False'],
'Saturn': [1350, 1510, 1430, 'True'],
'Uranus': [2750, 3000, 2880, 'True'],
'Venus': [107, 109, 108, 'True']}
附录
创建状态而不修改sol
def load_status(sol):
with open('status1.dat', "r") as s:
# create a lookup table for each sol key
sol_key_index = {k:i for i, k in enumerate(sol.keys())}
# Make status array the size of the keys
status = [0] * len(sol.keys())
for line in s:
line = line.rstrip('\n')
if len(line) > 0:
k, v = line.split(',') # get key, value from line
if k in sol: # if key in dictionary
status[sol_key_index[k]] = v # append value to status
return status
用法
status = load_status(sol)
输出
['True', 'True', 'True', 'True', 'True', 'True', 'True', 'True', 'False']
您可以通过首先将文件解析为字典,然后遍历 sol 键并检查解析后的字典中的值来实现所需的顺序。
def load_status(sol):
with open(status1.dat, "r") as s:
stat_dc = {i.split(",")[0]: i.split(",")[1] for i in s.split("\n")
status = [stat_dc[i] for i in sol]
print(status)
输出
['True', 'True', 'True', 'True', 'True', 'True', 'True', 'True', 'False']