Python中字典和列表推导式的问题讨论

如有字典: 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 的写法,想不出来,不甘心,请教一下大家
Python中字典和列表推导式的问题讨论


11 回复

sorted([(key, i+1) for key, value in d.items() for i in range(value)])


帖子标题是“Python中字典和列表推导式的问题讨论”,这是一个不涉及具体代码的、关于语言特性的概念性问题。

简单来说,列表推导式用于快速生成列表,字典推导式用于快速生成字典。它们的核心都是用一行简洁、可读的代码替代传统的for循环+append或赋值操作。

列表推导式的基本结构是 [expression for item in iterable if condition]。它遍历一个可迭代对象,对每个满足条件的元素进行表达式计算,并将结果收集到一个新列表中。例如,[x*2 for x in range(5) if x%2==0] 会生成 [0, 4, 8]

字典推导式的结构类似,是 {key_expression: value_expression for item in iterable if condition}。它同样遍历可迭代对象,但需要为每个元素分别计算出键和值,从而构建一个新字典。例如,{x: x**2 for x in range(5)} 会生成 {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

这两种推导式的优点是代码紧凑、执行效率通常比等效的循环稍高(因为解释器对其有优化),并且意图清晰。但要注意,过度复杂或嵌套的推导式会损害可读性,这时就该回归传统的循环写法。

总结:推导式是让代码更Pythonic的利器,但别为了炫技而牺牲可读性。

[(x, i) for x, y in d.items() for i in range(1, y + 1)]

为啥不能 append 了???
想到了另外一种
L=reduce(lambda x,y: x+y, [[(a, i) for i in range(1, n+1)] for a, n in d.iteritems()])

嗯,你的写法就是我想要的,多谢!

[(x, i) for x, y in d.iteritems() for i in xrange(1, y + 1)]

应该二楼的兼容性高点

我的方案是这样:
from itertools import product

l = []
for k in d:
l += list(product(k, range(1,d[k]+1)))

python 的 Iterable

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)
分解下

六年都过去了,时光如梭 。。。我现在都转写 Golang 了 哈哈

回到顶部