Python构建一个字典{0: [0, 0, 0], 1: [0, 0, 1], 2: [0, 0, 2], 3: [0, 0, 3], ...,999: [9, 9, 9]}。

3
我需要使用变量 base=10digits=set(range(10)) 来构建一个字典,并编写一个推导式,将从0到999的每个整数映射到代表该整数在十进制中的三位数列表。也就是说,该值应为:
{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个回答

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,因此上述语法是有效的。


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

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个字符的。 - Joran Beasley
好的,我已经更改为使用任意进制。 - nneonneo
它不允许使用任意字母表,但是这更接近他们想要的(+1)。 - Joran Beasley
1
字母表?数字只是整数。之后您可以将它们用作某些字母表示的索引。 - nneonneo

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

1

你的代码中有几个错误:

  • 你使用了类型list作为数组。也许你想写list(range(1000))?只需使用range(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}

base = 10 digits = set(range(10)) dict = {(xbase**2 + ybase1 + z*base0):[x,y,z] for x in digits for y in digits for z in digits} - Nikola Stanisic
是的,但我忘了告诉你 set(range(10)) 不是必需的。你可以直接使用 range(10)(它返回一个列表),使用 set 没有任何变化(当你想要唯一项时使用 set,但 range(10) 已经返回了一个唯一项的列表)。 - groug

1
这个怎么样:
{x:map(int,str(x).rjust(3,'0')) for x in xrange(1000)}

0
这是一个不错的单行代码:
result = dict((n,['0']*(3-len(str(n))) + list(str(n))) for n in xrange(1000))

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]}

0

感谢朋友们,我找到了一个解决方案,我认为这是我作为一个初学者最容易理解的方法

base = 10

digits = set(range(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 digits}


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

所以你想要将 999 转换成 [9, 99, 9] - Tim Pietzcker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接