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-05-19 14:35:43 +08:00 · 2825 次点击
    这是一个创建于 3140 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如有字典: 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-05-19 14:47:52 +08:00
    sorted([(key, i+1) for key, value in d.items() for i in range(value)])
    wang9571
        2
    wang9571  
       2016-05-19 14:47:59 +08:00   ❤️ 3
    [(x, i) for x, y in d.items() for i in range(1, y + 1)]
    chevalier
        3
    chevalier  
    OP
       2016-05-19 14:49:00 +08:00
    为啥不能 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-05-19 14:51:00 +08:00
    @wang9571 嗯,你的写法就是我想要的,多谢!
    felixzhu
        5
    felixzhu  
       2016-05-19 15:02:04 +08:00
    [(x, i) for x, y in d.iteritems() for i in xrange(1, y + 1)]
    holyzhou
        6
    holyzhou  
       2016-05-20 08:09:32 +08:00
    应该二楼的兼容性高点
    practicer
        7
    practicer  
       2016-06-18 22:27:19 +08:00
    我的方案是这样:
    from itertools import product

    l = []
    for k in d:
    l += list(product(k, range(1,d[k]+1)))
    antian
        8
    antian  
       2022-12-10 00:37:22 +08:00
    python 的 Iterable
    antian
        9
    antian  
       2022-12-10 00:41:00 +08:00
    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 10:05:49 +08:00
    @antian 六年都过去了,时光如梭 。。。我现在都转写 Golang 了 哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5452 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 07:09 · PVG 15:09 · LAX 23:09 · JFK 02:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.