3

我必须使用变量构造一个字典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

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

4

10 回答 10

5

我会用itertools. 例如

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

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

根据文档,该product函数计算笛卡尔积,相当于嵌套的 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,因此上述语法是有效的。

于 2013-07-16T21:50:29.870 回答
3
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)}
于 2013-07-16T21:43:39.690 回答
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)}
于 2013-07-16T21:44:21.770 回答
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)}
于 2013-07-16T21:47:31.630 回答
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}
于 2013-07-16T21:51:51.163 回答
1

那这个呢:

{x:map(int,str(x).rjust(3,'0')) for x in xrange(1000)}
于 2013-07-17T00:35:57.723 回答
0

谢谢朋友,我找到了解决方案,因为我是初学者,所以我认为最简单的方法是弄清楚这样的事情

基数 = 10

数字 = 设置(范围(10))

dict = {(x*base**2 + y*base**1 + z*base**0):[x,y,z] for x in digits for y in digits for z in numbers}

于 2013-07-18T20:35:44.997 回答
0

这是一个很好的单行:

result = dict((n,['0']*(3-len(str(n))) + list(str(n))) for n in xrange(1000))
于 2013-07-16T22:18:06.447 回答
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.zfillnumpy.base_repr用零填充字符串结果到指定长度(在我的情况下填写)。

对于base=10, nmax=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=2, nmax=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]}
于 2013-07-17T02:56:09.990 回答
-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]))
  }
于 2013-07-16T21:40:04.767 回答