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

2016-05-19 14:35:43 +08:00
 chevalier
如有字典: 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 的写法,想不出来,不甘心,请教一下大家
2712 次点击
所在节点    Python
10 条回复
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
2016-05-19 14:47:59 +08:00
[(x, i) for x, y in d.items() for i in range(1, y + 1)]
chevalier
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
2016-05-19 14:51:00 +08:00
@wang9571 嗯,你的写法就是我想要的,多谢!
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
2016-05-20 08:09:32 +08:00
应该二楼的兼容性高点
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
2022-12-10 00:37:22 +08:00
python 的 Iterable
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
2022-12-10 10:05:49 +08:00
@antian 六年都过去了,时光如梭 。。。我现在都转写 Golang 了 哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/279773

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX