为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我使用 for 循环从另一个字典创建的字典更小?

为什么我使用 for 循环从另一个字典创建的字典更小?

慕侠2389804 2022-06-14 09:54:10
bus_stops = jsoncalls.get_bus_stop()print(len(bus_stops))stop_map = {stop['Description']: stop for stop in bus_stops}print('extracted dic: '+str(len(stop_map)))这是我的代码的样子。基本上,我使用从 api 调用获得的另一种方法创建字典。然后我做了我认为是创建另一个字典,其中只填充了该字典中的值“描述”。第一个打印是第一个字典的长度。第二个打印是第二个的长度。5024extracted dic: 4457第二本词典短 600 条!我对可能导致这种情况的原因感到困惑。谁能给我建议?
查看完整描述

2 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

您通过将其用作键来按描述对项目进行分组。一个键只能存在一次。如果两个项目具有相同的描述,它们将占用相同的键,其中只有最后一个会存在。



查看完整回答
反对 回复 2022-06-14
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

由于 dict 键是唯一的,我敢打赌您在源 dict 中有重复的描述。例如,假设您有以下数据集:


bus_stops = [

  {"Id": 1, "Description": "spam"},

  {"Id": 2, "Description": "cheese"},

  {"Id": 3, "Description": "spam"},

]

注意结果中只有最后一个“垃圾邮件”:


>>> stop_map = {stop['Description']: stop for stop in bus_stops}

{

   'cheese': {'Description': 'cheese', 'Id': 2},

   'spam': {'Description': 'spam', 'Id': 3}},

}

如果是这种情况,并且您想按描述对停靠点进行分组,则可以使用带有描述作为键和停靠点列表作为值的 dict - 该setdefault方法对于这种数据转换很方便:


stop_map = {}

for stop in bus_stops:

    stop_map.setdefault(stop["Description"], []).append(stop)

结果:


{

    "cheese": [

        {

            "Id": 2, 

            "Description": "cheese"

        },

    ], 

    "spam": [

        {

            "Id": 1, 

            "Description": "spam"

        }, 

        {

            "Id": 3, 

            "Description": "spam"

        },

    ],

}


查看完整回答
反对 回复 2022-06-14
  • 2 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信