【问题标题】:Iteration over a list of dictionaries with for loop使用 for 循环迭代字典列表
【发布时间】:2021-05-24 21:27:20
【问题描述】:

在我的代码中,我尝试遍历字典列表并使用这些字典的值来创建新对象。 问题是,显然当我编写 for 循环时,它似乎直接迭代第一个字典中的元素,而不是迭代字典,我真的不明白为什么!

这是代码:

class Phase:

    def __init__(self, workshop, machining, operator, placings):

        self.workshop = workshop
        self.machining = machining
        self.operator = operator
        self.placings = placings


class Part:

    def __init__(self, name, phases):

        self.name = name
        self.phases = phases


class Loader:

    def __init__(self, cycles_file, workshops_file):

        self.cycles_file = cycles_file
        self.workshops_file = workshops_file
        self.workshops = []


cycles = {'part1': [{'workshop': 'ws1', 'machining': 10, 'operator': 0, 'placings': 2},
                    {'workshop': 'ws2', 'machining': 7, 'operator': 3, 'placings': 0}],
          'part2': {'workshop': 'ws3', 'machining': 5, 'operator': 5, 'placings': 0}}

parts = []
for part in cycles:
    print('part: ', part)
    name = part
    phases = []
    print('cycle: ', cycles[part], type(cycles[part]))
    for phase in cycles[part]:
        print('phase: ', phase, type(phase))
        workshop = phase.get('workshop')
        machining = phase.get('machining')
        operator = phase.get('operator')
        placings = phase.get('placings')
        phase = Phase(workshop, machining, operator, placings)
        phases.append(phase)
    part = Part(name, phases)
    parts.append(part)

workshops = {'ws1': {'turns': 3, 'turn duration': 8},
             'ws2': {'turns': 2, 'turn duration': 7.5},
             'ws3': {'turns': 2, 'turn duration': 7.5}}

loader = Loader(cycles, workshops)

这是我得到的结果:

part:  part1

cycle:  [{'workshop': 'ws1', 'machining': 10, 'operator': 0, 'placings': 2}, {'workshop': 'ws2', 
  'machining': 7, 'operator': 3, 'placings': 0}] 
<class 'list'>
 
phase:  {'workshop': 'ws1', 'machining': 10, 'operator': 0, 'placings': 2} 
<class 'dict'>

phase:  {'workshop': 'ws2', 'machining': 7, 'operator': 3, 'placings': 0}
<class 'dict'>

part:  part2

cycle:  {'workshop': 'ws3', 'machining': 5, 'operator': 5, 'placings': 0} 
<class 'dict'>
 
phase:  workshop <class 'str'>

 Traceback (most recent call last):
   File "C:\Users\damia\PycharmProjects\logistic_management_tool\try2.py", line 42, in <module>
     workshop = phase.get('workshop')
 AttributeError: 'str' object has no attribute 'get'

这里的问题是这个阶段应该是一个字典,因为它是在进入for循环之前!

【问题讨论】:

  • 你说的是哪个字典列表?你能想出一个更小的例子来说明同样的问题吗?

标签: python dictionary for-loop types


【解决方案1】:

我认为问题在于第 2 部分的阶段未定义为列表,因此 "internal" 循环的第二次迭代试图迭代 " 的键内部” 字典。

尝试在字典周围添加一对方括号,像这样

cycles = {'part1': [{'workshop': 'ws1', 'machining': 10, 'operator': 0, 'placings': 2},
                    {'workshop': 'ws2', 'machining': 7, 'operator': 3, 'placings': 0}],
          'part2': [{'workshop': 'ws3', 'machining': 5, 'operator': 5, 'placings': 0}]}
          #        ^                                                                 ^

【讨论】:

  • 是的,你是对的,我刚刚注意到对不起!还是谢谢
猜你喜欢
  • 1970-01-01
  • 2020-04-08
  • 2021-12-03
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
相关资源
最近更新 更多