【问题标题】:Python for loop only returning last value of a dictionaryPython for 循环仅返回字典的最后一个值
【发布时间】:2019-09-20 20:46:36
【问题描述】:

我正在尝试在 python 中创建一个带有 xyz 坐标的 json 转储,但是我用来遍历不同组的 for 循环只返回最后一组

self.group_strings = ['CHIN', 'L_EYE_BROW', 'R_EYE_BROW', 'L_EYE', 'R_EYE', 'T_NOSE', 'B_NOSE', 'O_LIPS', 'I_LIPS']

if reply == QMessageBox.Yes:
   for grp_str in self.group_strings:
       coords_data = self.point_dict[grp_str]['Coords']
       data = coords_data

   with open("data_file.json", "w") as write_file:
       json.dump(data, write_file)

预期结果是一个 JSON 文件,其中放置点的坐标如下:

[[x,y,z][x,y,z][x,y,z][x,y,z][x,y,z][x,y,z]等... ].

放置点的每个括号,当前输出为:

[[x,y,z][x,y,z][x,y,z][x,y,z][x,y,z][x,y,z][x,y ,z][x,y,z]].

由于最后一个组的大小为 8,因此只有 8 个值

在尝试了你的一些解决方案后,我最终得到了这个:

data = []
if reply == QMessageBox.Yes:
    for grp_str in self.group_strings:
        data.append(self.point_dict[grp_str]['Coords'])

        with open("data_file.json", "w") as write_file:
            json.dump(data, write_file)

print(data) 的输出是:

[[17.006101346674598,-24.222496770994944,95.14869919154683],[22.30318006424494,-21.376267007401097,94.70820903177969],[-24.066693590510965,21.205230021220736,96.57992975278633],[-7.9541006992288885,20.3986457061961,103.06739548846576],[-28.291138300128495,33.5422782651503,99.22546203301508],[ -40.61999270785583,40.90496355476136,90.2356807538543],[-39.293698815625135,52.39636618754361,96.72998820004932],[-28.29463915487483,48.772250886978405,102.25119515066885]]

【问题讨论】:

  • 您的示例字符串不是有效的 JSON。
  • 请生成一个工作示例代码。你的没有运行。

标签: python json python-3.x dictionary


【解决方案1】:

您在 for 循环中的每次迭代后覆盖您的 data 变量,因此您只能获得最后一次迭代。您需要初始化一些东西以将数据的每次迭代转储为某种“结果”数据:

self.group_strings = ['CHIN', 'L_EYE_BROW', 'R_EYE_BROW', 'L_EYE', 'R_EYE', 'T_NOSE', 'B_NOSE', 'O_LIPS', 'I_LIPS']

data = []
if reply == QMessageBox.Yes:
   for grp_str in self.group_strings:
       data.append(self.point_dict[grp_str]['Coords'])

   with open("data_file.json", "w") as write_file:
       json.dump(data, write_file)

【讨论】:

  • 为什么要创建一个新的results_data 变量?
  • 你是对的,它是多余的。感谢您指出这一点,进行了编辑。
【解决方案2】:

您需要将您的coords_data 添加到一个列表中,它们将被记住,然后将该列表写入文件,现在data = coords_data 只记住 coords_data 的最后一个值并将其写入文件。

self.group_strings = ['CHIN', 'L_EYE_BROW', 'R_EYE_BROW', 'L_EYE', 'R_EYE', 'T_NOSE', 'B_NOSE', 'O_LIPS', 'I_LIPS']

if reply == QMessageBox.Yes:
   datas = []
   for grp_str in self.group_strings:
       #Append all values to a list
       datas.append(self.point_dict[grp_str]['Coords'])

   #Write that list to file
   with open("data_file.json", "w") as write_file:
       json.dump(datas, write_file)

【讨论】:

    【解决方案3】:

    for 循环中,您将在每次迭代中用data = coords_data 覆盖data。如果data 是一个列表,则使用data.append(coords_data) 在每次迭代时向其中添加新数据。请注意,您需要在 for 循环之前使用 data = [] 对其进行初始化

    基本上:

    data = []
    for grp_str in group_strings:
       data.append(self.point_dict[grp_str]['Coords'])
    

    【讨论】:

    • 我已将行更改为 data = self.point_dict[grp_str]['Coords'] 以消除该问题,但仍然得到相同的结果
    • 应该是data.append(self.point_dict[grp_str]['Coords'])
    • 我已经为数据创建了一个列表并将字典附加到它上面,仍然得到与以前相同的结果,但是我已经使用你的建议来清理我的代码,所以谢谢
    • 在您的帖子中包含更新的代码以及print(data)的输出
    • with 块放在for 循环之外。
    【解决方案4】:

    您的 with 块位于 for 循环之外,因此它在循环完成后执行,并且只能访问最后一个元素,因为这是循环终止的状态。

    但是如果你每次都在你的循环块中打开一个 with ,你会再次得到相同的结果,所以你必须用 append mode 'a+' 打开它

    self.group_strings = ['CHIN', 'L_EYE_BROW', 'R_EYE_BROW', 'L_EYE', 'R_EYE', 'T_NOSE', 'B_NOSE', 'O_LIPS', 'I_LIPS']
    
    if reply == QMessageBox.Yes:
       for grp_str in self.group_strings:
           coords_data = self.point_dict[grp_str]['Coords']
           data = coords_data
           # with is now inside the for loop
           with open("data_file.json", "a+") as write_file:
               json.dump(data, write_file)
    

    更好的方法是在上下文管理器中运行循环。

    self.group_strings = ['CHIN', 'L_EYE_BROW', 'R_EYE_BROW', 'L_EYE', 'R_EYE', 'T_NOSE', 'B_NOSE', 'O_LIPS', 'I_LIPS']
    
    if reply == QMessageBox.Yes:
       with open("data_file.json", "w") as write_file:
           for grp_str in self.group_strings:
               coords_data = self.point_dict[grp_str]['Coords']
               data = coords_data
               json.dump(data, write_file)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-25
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 2022-01-24
      • 2022-01-11
      • 2019-02-08
      相关资源
      最近更新 更多