【问题标题】:python construct a dictionary {0: [0, 0, 0], 1: [0, 0, 1], 2: [0, 0, 2], 3: [0, 0, 3], ...,999: [9, 9, 9]}python 构造一个字典 {0: [0, 0, 0], 1: [0, 0, 1], 2: [0, 0, 2], 3: [0, 0, 3], ...,999 : [9, 9, 9]}
【发布时间】:2013-07-15 06:40:18
【问题描述】:

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

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

【问题讨论】:

    标签: python list dictionary integer list-comprehension


    【解决方案1】:

    我会使用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,所以上面的语法是有效的。

    【讨论】:

      【解决方案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)}
      

      【讨论】:

        【解决方案3】:

        你可以使用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)
        • 字母?数字只是整数。之后您可以将它们用作某些字母表示的索引。
        【解决方案4】:

        您的代码中有几处错误:

        • 您使用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 位 = set(range(10)) dict = {(xbase2 + ybase1 + z*base** 0):[x,y,z] for x in digits for y in digits for z in digits}
        • 是的,但我忘了告诉你set(range(10)) 不是必需的。您可以只使用range(10)(它返回一个列表),拥有一个集合不会改变任何东西(当您想要唯一项目时使用集合,但 range(10) 已经返回一个唯一项目列表)
        【解决方案5】:
        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)}
        

        【讨论】:

          【解决方案6】:

          这个呢:

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

          【讨论】:

            【解决方案7】:

            这是一个不错的单行:

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

            【讨论】:

              【解决方案8】:

              这会让你改变基础:

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

              【讨论】:

                【解决方案9】:

                谢谢朋友们,我找到了解决方案,我认为这是最简单的方法,因为我是初学者

                基数 = 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}

                【讨论】:

                  【解决方案10】:

                  我会使用的基本算法是

                  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]吗?
                  猜你喜欢
                  • 2014-08-05
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-11-28
                  • 1970-01-01
                  • 2018-09-26
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多