【问题标题】:Distinguishing Nested Dict Assignment from List Value Access in a Python Dictionary在 Python 字典中区分嵌套字典赋值和列表值访问
【发布时间】:2017-08-12 08:34:08
【问题描述】:

我有身体部位的字典“body”及其对应的边界框,形式为 (xmin, ymin, xmax, ymax):

body = {'lHand': [872, 1075, 920, 1194], 'lfoot': [831, 1665, 928, 1777], 
        'rfoot': [676, 1624, 741, 1743], 'rKnee': [657, 1313, 726, 1372], 
        'Lshoul': [809, 678, 885, 740], 'face': [698, 494, 816, 652], 
        'Lknee': [797, 1323, 862, 1395], 'rShoul': [608, 674, 690, 737], 
        'rHand': [563, 1074, 620, 1184], 'hips': [641, 977, 848, 1019]}

我想用一个嵌套字典替换这个字典中的每个列表值,其中每个键的列表元素本身都被标记:分别为 xmin、ymin、xmax 和 ymax。目标是这样的

body['part']['coordinate'] = value

喜欢

body['face']['xmin'] = 698

为此,我写了以下内容:

for (part, bounding_box) in body.items():
    for (coordinate, value) in zip(['xmin', 'ymin', 'xmax', 'ymax'], bounding_box):
        # the (non-functional) assignment 
        body[part][coordinate] = value
    body[part]['center'] = center(part)
    # joints are centers of body parts
    joint[part] = body[part]['center']

我得到的错误,

File "body.py", line 110, in <module>
    body[part][coordinate] = value
TypeError: list indices must be integers, not str

让我觉得 Python 正在阅读我创建嵌套字典元素的尝试,以尝试访问与键“part”关联的列表成员之一。

如何区分这两种操作?

谢谢!

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    是的,您的方法的问题在于:

    body[part][coordinate] = value
    

    body[part] 返回列表,然后您尝试使用字符串coordinate 对列表进行索引,但失败了。

    你可以只使用字典理解:

    >>> labels = ['xmin', 'ymin', 'xmax', 'ymax']
    >>> new_body = {k:dict(zip(labels, v)) for k,v in body.items()}
    >>> pprint(new_body)
    {'Lknee': {'xmax': 862, 'xmin': 797, 'ymax': 1395, 'ymin': 1323},
     'Lshoul': {'xmax': 885, 'xmin': 809, 'ymax': 740, 'ymin': 678},
     'face': {'xmax': 816, 'xmin': 698, 'ymax': 652, 'ymin': 494},
     'hips': {'xmax': 848, 'xmin': 641, 'ymax': 1019, 'ymin': 977},
     'lHand': {'xmax': 920, 'xmin': 872, 'ymax': 1194, 'ymin': 1075},
     'lfoot': {'xmax': 928, 'xmin': 831, 'ymax': 1777, 'ymin': 1665},
     'rHand': {'xmax': 620, 'xmin': 563, 'ymax': 1184, 'ymin': 1074},
     'rKnee': {'xmax': 726, 'xmin': 657, 'ymax': 1372, 'ymin': 1313},
     'rShoul': {'xmax': 690, 'xmin': 608, 'ymax': 737, 'ymin': 674},
     'rfoot': {'xmax': 741, 'xmin': 676, 'ymax': 1743, 'ymin': 1624}}
    >>>
    

    如你所愿:

    >>> new_body['face']['xmin']
    698
    >>>
    

    当然,理解结构可以用for循环代替:

    >>> new_body = {}
    >>> for k, v in body.items():
    ...     new_body[k] = dict(zip(labels, v))
    ...
    >>> pprint(new_body)
    {'Lknee': {'xmax': 862, 'xmin': 797, 'ymax': 1395, 'ymin': 1323},
     'Lshoul': {'xmax': 885, 'xmin': 809, 'ymax': 740, 'ymin': 678},
     'face': {'xmax': 816, 'xmin': 698, 'ymax': 652, 'ymin': 494},
     'hips': {'xmax': 848, 'xmin': 641, 'ymax': 1019, 'ymin': 977},
     'lHand': {'xmax': 920, 'xmin': 872, 'ymax': 1194, 'ymin': 1075},
     'lfoot': {'xmax': 928, 'xmin': 831, 'ymax': 1777, 'ymin': 1665},
     'rHand': {'xmax': 620, 'xmin': 563, 'ymax': 1184, 'ymin': 1074},
     'rKnee': {'xmax': 726, 'xmin': 657, 'ymax': 1372, 'ymin': 1313},
     'rShoul': {'xmax': 690, 'xmin': 608, 'ymax': 737, 'ymin': 674},
     'rfoot': {'xmax': 741, 'xmin': 676, 'ymax': 1743, 'ymin': 1624}}
    >>>
    

    我认为,通过阅读您的代码,您正试图“从长远来看”,如下所示:

    >>> new_body = {}
    >>> for k, v in body.items():
    ...     new_body[k] = {}
    ...     for coordinate, value in zip(labels, v):
    ...         new_body[k][coordinate] = value
    ...
    >>> pprint(new_body)
    {'Lknee': {'xmax': 862, 'xmin': 797, 'ymax': 1395, 'ymin': 1323},
     'Lshoul': {'xmax': 885, 'xmin': 809, 'ymax': 740, 'ymin': 678},
     'face': {'xmax': 816, 'xmin': 698, 'ymax': 652, 'ymin': 494},
     'hips': {'xmax': 848, 'xmin': 641, 'ymax': 1019, 'ymin': 977},
     'lHand': {'xmax': 920, 'xmin': 872, 'ymax': 1194, 'ymin': 1075},
     'lfoot': {'xmax': 928, 'xmin': 831, 'ymax': 1777, 'ymin': 1665},
     'rHand': {'xmax': 620, 'xmin': 563, 'ymax': 1184, 'ymin': 1074},
     'rKnee': {'xmax': 726, 'xmin': 657, 'ymax': 1372, 'ymin': 1313},
     'rShoul': {'xmax': 690, 'xmin': 608, 'ymax': 737, 'ymin': 674},
     'rfoot': {'xmax': 741, 'xmin': 676, 'ymax': 1743, 'ymin': 1624}}
    >>>
    

    【讨论】:

    • 对我来说太快了 :)
    • @JackLynch 我添加了一些说明。
    • @juanpa.arrivillaga 我是!我尽可能使用列表推导,但我还是比较新的,有时我只是把自己弄糊涂了哈哈。再次感谢,非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    相关资源
    最近更新 更多