我正在导入一个文本文件,该文件将行星与其状态关联为True(对于行星),或False(对于矮星),其顺序必须与下面的字典键相同。
这是一本名为“索尔”的字典:
{‘天王星’:[275030002880],‘水星’:[46,70,57],‘地球’:[147152150],‘金星’:[107109108],‘火星’:[205249228],‘土星’:[13501510140],‘木星’:[74181779],‘海王星’:[445045504500],‘冥王星’:[444073805910]}
这是我正在导入的名为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)
现在的打印(状态)按数据文件的顺序给出,如下所示:
[‘真’、‘真’、‘真’、‘真’、‘真’、‘假’、‘真’、‘真’]
正确的顺序是列表:
['真','真','真','真','真','真','真','假']
您可以通过首先将文件解析为判决,然后遍历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']
最小化对代码的更改
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']}
补遗
创建状态而不修改溶胶
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']
我正试图连载我的表格,但由于某种原因我不能使它工作。表单的系列化工作正在进行。但问题是,我需要在之后添加一个列表,因为它不是表单的一部分,并且在这样做时,当它到达我的控制器endpoint时,我的模型是空的。 我正在打的控制器的功能: 对象产品运行良好,但模型为。 有没有人有什么建议,如何解决这个问题?:-) 请不要介意像Model这样的对象的名称,这在我们的项目中被命名为其他的东西。
给一本字典: 如何将键附加到列表中? 我走了这么远:
问题内容: 问题 我正在以以下方式创建一个空列表作为值的字典。 字典看起来像这样。 当我将一个值附加到一个列表时,此示例将值附加到所有列表。 问题 我的问题分为两部分。首先,为什么会这样?第二,我该怎么办?也就是说,如何将一个值仅附加到一个列表中? 我想象在创建字典时,我使所有列表都指向同一个对象。但是我不明白怎么回事,因为当我输入而不是在字典创建中,然后添加值而不是附加值时,这些值的行为会不同,
问题内容: 有没有更优雅的方式来编写此代码? 我在做什么:我有键和日期。可能有多个日期分配给键,因此我正在创建一个包含日期列表的字典来表示这一点。以下代码可以正常工作,但是我希望有一个更优雅和Pythonic的方法。 我期望下面的工作,但我不断得到一个NoneType没有属性附加错误。 这可能与以下事实有关: 但为什么? 问题答案: 返回,因为它是就地操作,并且您将其分配回。因此,下一次您实际要做
问题内容: 我有一个清单 我想将其转换为字典 我该怎么做? 问题答案: 采用: 返回: 如果需要整数,请在以下位置更改分配: 这将给出:
问题内容: 我该如何列出这样的词典列表。 …变成这样的单个字典: 问题答案: 这适用于任何长度的字典: 作为一个理解: