我必须使用变量base=10
和digits=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
这不是正确的思考方式,任何想法?
答案 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=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]}
答案 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]))
}