V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
wsds
V2EX  ›  Python

这种字典,在不知道有多少个 value 的情况下,怎么取到其值?

  •  
  •   wsds · 2018-08-07 11:22:47 +08:00 · 3217 次点击
    这是一个创建于 2300 天前的主题,其中的信息可能已经有所发展或是发生改变。
    b = {
        "data": [{
            "id": "1"
        }, {
            "id": "2"
        }, {
            "id": "3"
        }],
          #这里有 N 个 id,且 N 是个不确定的值
        "total": 0
    }
    	
    

    我想到的是 try 的形式,但感觉这是个很 low 的方法,有没有比较官方的,便捷的办法取到 id 的?求万能的 v 友推荐一下

    num = -1
    while(True):
    	num += 1
    	try:
    		id=b["data"][num]["id"]
    		print(id)
    	except IndexError:
    		break
    
    23 条回复    2018-08-07 18:00:34 +08:00
    NaVient
        1
    NaVient  
       2018-08-07 11:30:54 +08:00
    dict.keys()
    wsds
        2
    wsds  
    OP
       2018-08-07 11:34:13 +08:00
    @NaVient 这个输出是
    dict_keys(['data', 'total'])
    wsds
        3
    wsds  
    OP
       2018-08-07 11:36:18 +08:00
    @NaVient dict.values()输出了
    dict_values([[{'id': '1'}, {'id': '2'}, {'id': '3'}], 0])
    但这个类型好奇怪,怎么再拿到 id
    Tyanboot
        4
    Tyanboot  
       2018-08-07 11:36:20 +08:00 via Android
    len(b["data"]) 了解下

    可以直接

    for i in b["data"]:
    id_ = i["id"]
    mkeith
        5
    mkeith  
       2018-08-07 11:36:48 +08:00
    [item["id"] for item in b["data"] ]
    ik
        6
    ik  
       2018-08-07 11:37:01 +08:00
    ```
    >>> for i in b['data']:
    ... print(i['id'])
    ...
    1
    2
    3
    ```
    这样有什么问题吗? 另外`"total"`是不是对应 id 的数量?
    noqwerty
        7
    noqwerty  
       2018-08-07 11:37:05 +08:00 via Android
    len(b['data'])
    wsds
        8
    wsds  
    OP
       2018-08-07 11:38:48 +08:00
    @Tyanboot @ik,多谢
    不错,学习了,确实可以

    ```python
    b = {
    "data": [{
    "id": "1"
    }, {
    "id": "2"
    }, {
    "id": "3"
    }],
    "total": 0
    }

    for i in b["data"]:
    print(i["id"])
    ```
    masha
        9
    masha  
       2018-08-07 11:39:31 +08:00
    for dd in b['data']:
    print(dd.get('id'))
    qiayue
        10
    qiayue  
       2018-08-07 11:39:32 +08:00
    data 里边不是数组吗?难道 python 不能对数据做循环?
    wsds
        11
    wsds  
    OP
       2018-08-07 11:39:38 +08:00
    @mkeith 好强,列表生成器,感谢啊
    wsds
        12
    wsds  
    OP
       2018-08-07 11:41:21 +08:00
    @qiayue 问题是 id 不知道有多少个,不知道 len
    jeremaihloo
        13
    jeremaihloo  
       2018-08-07 11:48:17 +08:00
    @wsds #12 你数据都有了,直接用 len()函数,为啥会不知道有多少个 ID
    qiayue
        14
    qiayue  
       2018-08-07 11:50:30 +08:00
    数组都给你了,怎么可能会不知道数组长度
    blodside
        15
    blodside  
       2018-08-07 12:28:13 +08:00
    一个 map 就行了啊

    map(lambda x: x['id'], b['data'])
    wsds
        16
    wsds  
    OP
       2018-08-07 12:46:45 +08:00
    @qiayue
    @jeremaihloo 哦哦,对对,搞懵逼了,现在明白了,谢谢
    wsds
        17
    wsds  
    OP
       2018-08-07 12:47:02 +08:00
    @blodside 多谢,lambda 这个函数很少使用,学习了
    bravecarrot
        18
    bravecarrot  
       2018-08-07 14:28:04 +08:00
    @wsds map reduce filter zip enumerate lambda sort collections 这些关键字 /函数 /库 在处理这类问题时很有用 可以看下
    wsds
        19
    wsds  
    OP
       2018-08-07 15:04:13 +08:00
    @bravecarrot 多谢提醒,我学习一下
    fjun3333
        20
    fjun3333  
       2018-08-07 15:12:26 +08:00
    列表推导式?
    id_lst = [item['id'] for item in b['data']]
    WO31400
        21
    WO31400  
       2018-08-07 15:37:26 +08:00
    使用 jsonpath

    import jsonpath
    b = {
    "data": [{
    "id": "1"
    }, {
    "id": "2"
    }, {
    "id": "3"
    }],
    # 这里有 N 个 id,且 N 是个不确定的值
    "total": 0
    }
    data = jsonpath.jsonpath(b,"$..id")
    print(data)

    data = ['1', '2', '3']
    PulpFunction
        22
    PulpFunction  
       2018-08-07 16:55:16 +08:00
    明显爬虫入门选手 哈哈 有个官方的 json dumps 里面有个自造的转换函数的参数,留下有用的 去掉没用的
    wlsnx
        23
    wlsnx  
       2018-08-07 18:00:34 +08:00
    [x["id"] for x in b["data"]]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2639 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:06 · PVG 19:06 · LAX 03:06 · JFK 06:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.