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
css3
V2EX  ›  Python

一个 dict 中的 key 包含 list, list 里边多个字典,用 2 个 for 怎么把 key 放到一个 list?

  •  
  •   css3 · 2020-08-24 22:01:56 +08:00 · 1955 次点击
    这是一个创建于 1557 天前的主题,其中的信息可能已经有所发展或是发生改变。
    # 最终想要这个类型的数据 {"key": ["a", "b"]}
    mylist= {"key": [{'a': '1'}, {'b': '2'}]}
    all = {}
    for k, v in mylist.items():
        for j in v:
            all.setdefault(j, []).append(j.keys())
    
    # TypeError: unhashable type: 'dict' 怎么设置字典的 value 默认类型是 list,且可以 append? 
    
    9 条回复    2020-09-06 21:27:57 +08:00
    JacHammer
        1
    JacHammer  
       2020-08-24 22:15:34 +08:00
    ```python
    mylist= {"key": [{'a': '1'}, {'b': '2'}]}
    all = {"key": []}
    for k, v in mylist.items():
    for j in v:
    all['key'] += j.keys()
    ```
    css3
        2
    css3  
    OP
       2020-08-24 22:17:43 +08:00 via iPhone
    @JacHammer 可是 mylist 里边有多个 key,我举例只写了一个
    maddevil
        3
    maddevil  
       2020-08-24 22:42:14 +08:00
    ```
    mylist = {"key": [{'a': '1'}, {'b': '2'}]}
    all = {}
    for k, v in mylist.items():
    all[k] = []
    for j in v:
    all[k] += j.keys()
    ```
    Trim21
        4
    Trim21  
       2020-08-24 22:47:01 +08:00
    'dict' 怎么设置字典的 value 默认类型是 list,且可以 append?

    from collections import defaultdict

    d = defaultdict(list)
    d[1].append(2)
    print(d[1])
    maddevil
        5
    maddevil  
       2020-08-24 22:51:48 +08:00
    其实还可以一行搞定:
    {k: [j for i in v for j in i.keys()] for k, v in mylist.items()}
    GoLand
        6
    GoLand  
       2020-08-24 22:53:43 +08:00
    In [30]: example = {'key': [{'a': '1'}, {'b': '2', 'c': '3'}], 'key2': [{'c': 1}, {'d': 2}]}

    In [31]: res = {}

    In [32]: for k, v in example.items():
    ...: res[k] = list(itertools.chain.from_iterable(map(lambda x: x.keys(), v)))
    ...:

    In [33]: res
    Out[33]: {'key': ['a', 'b', 'c'], 'key2': ['c', 'd']}
    h272377502
        7
    h272377502  
       2020-08-25 11:19:20 +08:00
    楼主什么操作,j 的 type 是 dict,dict 是 unhashable 的对象,你的目的明明是以 k 作为 value 。。。
    最后一行改成这样吧 all.setdefault(k, []).append(list(j.keys()))
    css3
        8
    css3  
    OP
       2020-08-25 22:36:15 +08:00
    @css3 @JacHammer @maddevil @Trim21 @GoLand @h272377502
    感谢各位老哥老姐,学习了👍
    biglazycat
        9
    biglazycat  
       2020-09-06 21:27:57 +08:00
    mylist= {"key": [{'a': '1'}, {'b': '2'}]}

    all = {}

    for k, v in mylist.items():
    for j in v:
    all.setdefault(k, []).append(list(j.keys())[0])

    print(all)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1067 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:05 · PVG 04:05 · LAX 12:05 · JFK 15:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.