python构造一个字典{0:[0,0,0],1:[0,0,1],2:[0,0,2],3:[0,0,3],…,999:[9,9,9]}

2024-05-12 19:21:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须使用变量base=10digits=set(range(10))构造一个字典,并编写一个理解,将从0到999的每个整数映射到表示以10为基数的整数的三位数列表。也就是说,值应该是

{0: [0, 0, 0], 1: [0, 0, 1], 2: [0, 0, 2], 3: [0, 0, 3], ...,10: [0, 1, 0], 11: [0, 1, 1], 12: [0, 1, 2], ...,999: [9, 9, 9]}

我被卡住了。在

我试过

^{pr2}$

但指数q应该是x * base**2 + y * base**1 + z * base**0

这不是正确的思维方式,有什么想法吗?在


Tags: 列表base字典方式range整数指数思维
3条回答

我会使用itertools。例如

dict( (i, tup) for i, tup in enumerate(itertools.product(range(10), repeat=3)) )

如果您真的要求每个值都是一个列表,您可以在上面添加(i, list(tup))

根据documentationproduct函数计算笛卡尔积,相当于嵌套的for循环。例如

^{pr2}$

product(range(3), repeat=3)相当于product(range(3), range(3), range(3))product函数接受*iterables,因此上面的语法是有效的。

您可以使用divmod分解每个数字:

d = {}
for i in xrange(base**3):
    a,b = divmod(i, base**2)
    b,c = divmod(b, base)
    d[i] = [a,b,c]

或者,使用很少使用的reduce函数的构造性解决方案:

^{pr2}$
alphabet =  range(10)
base = 10
dict((x*base**2+y*base+z,(x,y,z)) for x in alphabet 
                                  for y in alphabet 
                                  for z in alphabet )

是你想要的。。。我想

^{pr2}$

产生

{0: (0, 0, 0), 1: (0, 0, 1), 2: (0, 1, 0), 3: (0, 1, 1), 4: (1, 0, 0), 5: (1, 0, 1), 6: (1, 1, 0), 7: (1, 1, 1)}

相关问题 更多 >