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

时间:2013-07-16 21:37:05

标签: python list dictionary integer list-comprehension

我必须使用变量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]}

我被困住了。

我试过像

这样的东西
{q:[x,y,z] for q in list[range(1000)] for x in digits for y in digits for z in digits}   

但索引 q 应为x * base**2 + y * base**1 + z * base**0

这不是正确的思考方式,任何想法?

10 个答案:

答案 0 :(得分:5)

我会使用itertools。例如

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

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

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

In [34]: list(itertools.product(range(3), repeat=3))
Out[34]: 
[(0, 0, 0),
 (0, 0, 1),
 (0, 0, 2),
 (0, 1, 0),
 (0, 1, 1),
 (0, 1, 2),
 (0, 2, 0),
 (0, 2, 1),
 (0, 2, 2),
 (1, 0, 0),
 (1, 0, 1),
 (1, 0, 2),
 (1, 1, 0),
 (1, 1, 1),
 (1, 1, 2),
 (1, 2, 0),
 (1, 2, 1),
 (1, 2, 2),
 (2, 0, 0),
 (2, 0, 1),
 (2, 0, 2),
 (2, 1, 0),
 (2, 1, 1),
 (2, 1, 2),
 (2, 2, 0),
 (2, 2, 1),
 (2, 2, 2)]

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

答案 1 :(得分:2)

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 )

是你想要的......我想

alphabet =  range(2)
base = 2
dict((x*base**2+y*base+z,(x,y,z)) for x in alphabet 
                                  for y in alphabet 
                                  for z in alphabet )

产生

{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)}

答案 2 :(得分:2)

您可以使用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函数的构造性解决方案:

from itertools import product
d = {reduce(lambda x,y: base*x+y, p):list(p) for p in product(xrange(base), repeat=3)}

答案 3 :(得分:1)

f= lambda x : [int(x/100),int(x/10)%10,x%10]
k={}
for p in xrange(0,1000):
   k[p]=f(p)

甚至:

d = {x: [int(x/100),int(x/10)%10,x%10]  for x in xrange(0,1000)}

答案 4 :(得分:1)

您的代码中存在一些错误的内容:

  • 您将list(类型)用作数组。也许你打算写list(range(1000))?只需使用范围(1000)。
  • 您的for q in range(1000)太多了:您总循环为1000 * 10 * 10 * 10而不是10 * 10 * 10循环。

在不修改过多代码的情况下,您应该编写以下内容(通过使用代码进行计算q):

{(x*base**2 + y*base**1 + z*base**0):[x,y,z] for q in list[range(1000)] for x in digits for y in digits for z in digits}

答案 5 :(得分:1)

这个怎么样:

{x:map(int,str(x).rjust(3,'0')) for x in xrange(1000)}

答案 6 :(得分:0)

这是一个很好的单行:

result = dict((n,['0']*(3-len(str(n))) + list(str(n))) for n in xrange(1000))

答案 7 :(得分:0)

这将允许您更改基数:

import numpy as np
base = 10
nmax = 10
fill = len(np.base_repr(nmax, base=base))
d = {q:map(int, list(np.base_repr(q, base=base).zfill(fill))) for q in range(nmax+1)}
print(d)

str.zfill会将numpy.base_repr的字符串结果用零填充到指定的长度(填写我的情况)。

对于base=10nmax=10(您需要nmax=999)。

{0: [0, 0], 1: [0, 1], 2: [0, 2], 3: [0, 3], 4: [0, 4], 5: [0, 5], 6: [0, 6], 7: [0, 7], 8: [0, 8], 9: [0, 9], 10: [1, 0]}

代表base=2nmax=10

{0: [0, 0, 0, 0], 1: [0, 0, 0, 1], 2: [0, 0, 1, 0], 3: [0, 0, 1, 1], 4: [0, 1, 0, 0], 5: [0, 1, 0, 1], 6: [0, 1, 1, 0], 7: [0, 1, 1, 1], 8: [1, 0, 0, 0], 9: [1, 0, 0, 1], 10: [1, 0, 1, 0]}

答案 8 :(得分:0)

谢谢各位朋友,我找到了一个解决方案,我觉得最简单的方法就是找出这样的东西,因为我是初学者

base = 10

digits = set(range(10))

dict = {(x * base ** 2 + y * base ** 1 + z * base ** 0):[x,y,z]表示x的数字,y表示数字为z的数字} < / p>

答案 9 :(得分:-2)

我使用的基本算法是

for(1->1000)
  {
     if(x < 10)
         insert(x,[0,0,x]))
     else if(x<100)
         insert(x,[0,x/10,x%10]))
     else
         insert(x,[x/100,x/10,x%10]))
  }