为什么在Python的列表中从我的词典中打印错误的值?

时间:2015-07-07 00:55:19

标签: python json dictionary

我正在使用Python中的JSON结构访问列表中的字典。我希望能够访问每个字典索引中的值。在下面的代码中,我想访问[1]值的索引,但是在打印时测试是否捕获了正确的值,没有打印任何内容,当我打印[0]索引时,{{ 1}}索引打印下面JSON中的第二个列表/字典。

所以在下面的代码中,我希望能够遍历每个列表中的第二个字典并使用它们中的值

[3]

JSON:

try:
        k_bulky_item_2 = ' '
        k_bulky_count_2 = ' '
        k_bulky_name_2 = ' '
        k_bulky_comm_2 = ' '
        for sr in BulkyItem:
          if("BulkyItem" in BulkyItem):
            lbuklyitem311 = BulkyItem["BulkyItem"]
            for BulkyItem in lbuklyitem311:
                k_bulky_item_2= BulkyItem['BulkyItemType']
                k_bulky_count_2 = BulkyItem['BulkyItemCount']
                k_bulky_comm_2= BulkyItem['Type']
                k_bulky_name_2= BulkyItem['Name']
                if BulkyItem == lbuklyitem311[1]:
                    k_bulky_item_2= k_bulky_item_2
                    k_bulky_count_2 = k_bulky_count_2
                    k_bulky_name_2 =k_bulky_name_2
                    k_bulky_comm_2 = k_bulky_comm_2
                if k_bulky_comm_2 == 'Bulky Items':
                    k_bulky_comm_2 = 1
    except:
        print "No Bulky Information_2"


        print k_bulky_count_2

1 个答案:

答案 0 :(得分:0)

好的,让我们用数据分解代码的相关部分....实际上不能这样做,因为你的代码完全混乱,你在所有级别的访问中重用相同的变量名。你做不到这一点,这使得程序像你一样困惑。无论如何,从头开始:

for sr in BulkyItem:

我将假设这一行是为了获取"ServiceRequest"的列表?在这种情况下,此级别的BulkyItem应为JSON["ListOfServiceRequest"]["ServiceRequest"],具体如下:

"ListOfServiceRequest": {
    "ServiceRequest": [
        {...}
    ]
}

否则你只是在遍历字典的键,但是你正在访问以下类似的值...因为你再次分配BulkyItem以后事情变得非常混乱,但是试着效仿。

所以现在,在第一次迭代中,sr应包含类似的内容:

{
    "AddressVerified": "Y",
    "ListOfLa311BulkyItem": {
        "BulkyItem": [...]
    ...
}

很酷,现在我们看到您可以使用if("BulkyItem" in BulkyItem):来检查会员资格,这是完全错误的,并且还记得BulkyItemJSON["ListOfServiceRequest"]["ServiceRequest"]我假设您的代码如何工作(你的评论表明BulkyItem实际上是进一步下降,但这只是因为你对你所写的内容感到困惑。)

    if "BulkyItem" in BulkyItem:
        lbuklyitem311 = BulkyItem["BulkyItem"]

同样,这里的BulkyItem是什么? BulkyItem [“BulkyItem”]实际上是指这个级别的任何东西吗?至少lbuklyitem311表示它是键"ListOfLa311BulkyItem"的值。我们假设。

        for BulkyItem in lbuklyitem311:

这是每个人都对你正在做的事情感到困惑的地方,但是如果你得到了上面的代码,那么你的代码实际上已经迭代到了这里,而不是简单地没有到达(并导致KeyError

所以,让我们再次尝试这一点,并进行修正。变量JSON将包含JSON:section中列出的数据(已更正右括号)。

>>> for sr in JSON['ListOfServiceRequest']['ServiceRequest']:
...     lbuklyitem311 = sr['ListOfLa311BulkyItem']
...     if 'BulkyItem' in lbuklyitem311:
...         for bulkyitem in lbuklyitem311['BulkyItem']:
...             k_bulky_item_2 = bulkyitem['BulkyItemType']
...             k_bulky_count_2 = bulkyitem['BulkyItemCount']
...             k_bulky_comm_2 = bulkyitem['Type']
...             k_bulky_name_2 = bulkyitem['Name']
... 
>>> print k_bulky_count_2
1

上述内容至少可以帮助您开始尝试实现的复杂业务逻辑。不要试图重复使用变量名,尤其是在for循环中,因为它实际上是在一堆花瓶下面扯下地毯并打破一切。

哦,最后一件事,你可以通过这样做简单地消除成员资格检查并减少缩进杂乱:

>>> for sr in JSON['ListOfServiceRequest']['ServiceRequest']:
...     lbuklyitem311 = sr['ListOfLa311BulkyItem']
...     for bulkyitem in lbuklyitem311.get('BulkyItem', []):

如果调用lbuklyitem311['BulkyItem']通常会导致KeyError,则默认为空列表,for循环将无效地执行任何操作。

除此之外:

  

在上面的JSON中,列表中有多个字典,我想在每个列表中识别BulkyItemCount的[1]索引我正在这样做,因为我需要将每个字典映射到ArcGIS中的NumPytoFeatureClass。所以你看到每个服务请求号有多个BulkyItemCounts,我需要跟踪所有这些,每个Name字段,这是每个字典的唯一ID。因此,如果查看JSON,第一个列表[1]索引BulkyItemCount为1,第二个列表BulkyItemCount为500.

     

我使用[0]索引(如果找不到[1])..所以你明白我在追求什么。

如果你花一些时间考虑已经拥有的东西,这并不难。你有lbuklyitem311可以拥有列表的`lbuklyitem311 ['BulkyItem'],只是按你的意愿戳它。

>>> for sr in JSON['ListOfServiceRequest']['ServiceRequest']:
...     lbuklyitem311 = sr['ListOfLa311BulkyItem']
...     if 'BulkyItem' in lbuklyitem311:
...         if len(lbuklyitem311['BulkyItem'] == 1)
...             # do something with lbuklyitem311['BulkyItem'][0]['BulkyItemCount']
...         elif len(lbuklyitem311['BulkyItem'] > 1)
...             # do something with lbuklyitem311['BulkyItem'][1]['BulkyItemCount']