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

讨论一个 Python 字典和列表推导式问题

  •  
  •   chevalier · 2016 年 5 月 19 日 · 3232 次点击
    这是一个创建于 3529 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如有字典: d = {'x': 2, 'y': 3, 'z': 5}

    要得到列表:[('x', 1),('x', 2),('y', 1),('y', 2), ('y', 3),('z', 1),('z', 2),('z', 3),('z', 4),('z', 5)]

    我只能想到写法:
    L = []
    for a, n in d.iteritems():
    ....L += [(a, i) for i in range(1, n+1)]

    print L

    但总感觉还有更 pythonic 的写法,想不出来,不甘心,请教一下大家
    10 条回复    2022-12-10 10:05:49 +08:00
    justfly
        1
    justfly  
       2016 年 5 月 19 日
    sorted([(key, i+1) for key, value in d.items() for i in range(value)])
    wang9571
        2
    wang9571  
       2016 年 5 月 19 日   ❤️ 3
    [(x, i) for x, y in d.items() for i in range(1, y + 1)]
    chevalier
        3
    chevalier  
    OP
       2016 年 5 月 19 日
    为啥不能 append 了???
    想到了另外一种
    L=reduce(lambda x,y: x+y, [[(a, i) for i in range(1, n+1)] for a, n in d.iteritems()])
    chevalier
        4
    chevalier  
    OP
       2016 年 5 月 19 日
    @wang9571 嗯,你的写法就是我想要的,多谢!
    felixzhu
        5
    felixzhu  
       2016 年 5 月 19 日
    [(x, i) for x, y in d.iteritems() for i in xrange(1, y + 1)]
    holyzhou
        6
    holyzhou  
       2016 年 5 月 20 日
    应该二楼的兼容性高点
    practicer
        7
    practicer  
       2016 年 6 月 18 日
    我的方案是这样:
    from itertools import product

    l = []
    for k in d:
    l += list(product(k, range(1,d[k]+1)))
    antian
        8
    antian  
       2022 年 12 月 10 日
    python 的 Iterable
    antian
        9
    antian  
       2022 年 12 月 10 日
    d = {'x': 2, 'y': 3, 'z': 5}
    ls = []
    for i, j in d.items():
    # j 是一个迭代器
    for x in range(1, j + 1):
    ls.append((i, x))
    print(ls)
    分解下
    chevalier
        10
    chevalier  
    OP
       2022 年 12 月 10 日
    @antian 六年都过去了,时光如梭 。。。我现在都转写 Golang 了 哈哈
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   897 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:59 · PVG 05:59 · LAX 13:59 · JFK 16:59
    ♥ Do have faith in what you're doing.