【问题标题】:Logic for building converter using python dictionary values使用 python 字典值构建转换器的逻辑
【发布时间】:2014-07-16 08:53:22
【问题描述】:

我有这样一段加载的 json tp python 字典(size_dict):

{
 "sizeOptionName":"XS",
 "sizeOptionId":"1528",
 "sortOrderNumber":"7017"
},
{
"sizeOptionName":"S",
"sizeOptionId":"1529",
"sortOrderNumber":"7047"
},
{
"sizeOptionName":"M",
"sizeOptionId":"1530",
"sortOrderNumber":"7095"
}

而且我有尺寸 Id (dictionary_prod) 的产品:

{
"catalogItemId":"7627712",
"catalogItemTypeId":"3",
"regularPrice":"0.0",
"sizeDimension1Id":"1528",
"sizeDimension2Id":"0",
}

我需要为任何产品做这样的输出:

 result_dict = {'variant':
 [{"catalogItemId":"7627712", ...some other info...,
 'sizeName': 'XS', 'sizeId': '1525'}}]}

所以我需要转换尺寸 ID 并将其添加到新的结果对象中

最好的pythonic方法是什么? 我不知道如何从 size_dict 获取正确的数据

    if int(dictionary_prod['sizeDimension1Id']) > o:
        (result_dict['variant']).append('sizeName': size_dict???)

【问题讨论】:

  • size_dict 不是字典;这是一个列表。
  • @MartijnPieters 是的,我知道,只是拼写错误

标签: python dictionary converter


【解决方案1】:

正如 Tommy 所提到的,最好将尺寸 ID 映射到它们各自的字典。

size_dict = \
[
    {
         "sizeOptionName":"XS",
         "sizeOptionId":"1528",
         "sortOrderNumber":"7017"
    },
    {
        "sizeOptionName":"S",
        "sizeOptionId":"1529",
        "sortOrderNumber":"7047"
    },
    {
        "sizeOptionName":"M",
        "sizeOptionId":"1530",
        "sortOrderNumber":"7095"
    }
]

size_id_map = {size["sizeOptionId"] : size for size in size_dict}

production_dict = \
[
    {
        "catalogItemId":"7627712",
        "catalogItemTypeId":"3",
        "regularPrice":"0.0",
        "sizeDimension1Id":"1528",
        "sizeDimension2Id":"0",
    }
]

def make_variant(idict):
    odict =  idict.copy()
    size_id = odict.pop("sizeDimension1Id")
    odict.pop("sizeDimension2Id")
    odict["sizeName"] = size_id_map[size_id]["sizeOptionName"]
    odict["sizeId"]   = size_id
    return odict

result_dict = \
{
    "variant" : [make_variant(product) for product in production_dict]
}

print(result_dict)

【讨论】:

  • 您正在使用 .pop 来防止重复创建?
  • 但是如果我也需要存储 sizeDimension2Id 怎么办?
  • 这很简单。您将 size2 存储在一个变量中,就像使用 size1 一样,并使用它在地图中查找其好听的名称。我将把它作为练习留给你。
  • 我按照你说的做,但是没有找到 2 种尺寸的键,有点奇怪,因为可以在调试中看到它们...
  • 您需要查看您的数据以查看是否始终使用sizeDimension2Id
【解决方案2】:

您的问题有点令人困惑,但看起来您有一个包含一些信息的字典列表 (size_dict),并且您想要查找列表中包含您感兴趣的 SizeOptionName 的特定元素所以您可以读取 SizeOptionID。

所以首先你可以将你的 size_dict 整理为字典而不是列表 - 即

    sizeDict = {"XS":{
     "sizeOptionName":"XS",
     "sizeOptionId":"1528",
     "sortOrderNumber":"7017"
    }, "S": {
    "sizeOptionName":"S",
    "sizeOptionId":"1529",
    "sortOrderNumber":"7047"
    }, ...

然后您可以通过执行以下操作读取所需的 SizeOptionID:

    sizeDict[sizeNameYouAreLookingFor][SizeOptionID]

或者,您可以保留当前结构,只搜索 size_dict 的字典列表。

所以:

    for elem in size_dict:
        if elem.SizeOptionID == sizeYouAreLookingFor:
            OptionID = elem.SizeOptionId

或者你在问别的问题?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多