【问题标题】:How to generate a random dictionary?如何生成随机字典?
【发布时间】:2019-02-22 18:06:00
【问题描述】:

我需要创建一个字典,其中包含给定范围的键和随机值,即

{key 1: value1, key 2: value2, key 3: value1, key 4: value 1, key 5: value 1}

{key 1: value2, key 2: value1, key 3: value1, key 4: value 1, key 5: value 1}

{key 1: value1, key 2: value1, key 3: value1, key 4: value 1, key 5: value 2}

...等等

如你所见,字典的模式如下:

  • 按键是从函数的输入数字生成的,如果我输入5,我有5个按键,如果我输入3,我有3个按键
  • 该值只有2个不同的值(value1value2),但value2在任意键中只能随机出现1次。剩余的值为value1

代码:

def function(n):
   from random import randrange
   mydict = {}
   for i in range(5):
         key = "key " + str(i)

   value = ['value1', 'value2']

【问题讨论】:

  • 对字典中将出现的键值对的数量是否有任何限制?

标签: python dictionary random


【解决方案1】:

你可以试试这个:

>>> def func(n):
...   mydict = {}
...   for i in range(n):
...     mydict['key'+str(i)] = randrange(10)
...   return mydict
... 
>>> print(func(5))
{'key0': 8, 'key1': 2, 'key2': 4, 'key3': 4, 'key4': 7}

【讨论】:

    【解决方案2】:

    只需将所有值先默认为value1,然后随机选择一个键更改为value2

    def function(n):
       from random import randrange
       values = ['value1', 'value2']
       mydict = {"key " + str(i): values[0] for i in range(n)}
       mydict["key " + str(random.randrange(n))] = values[1]
    
       return mydict
    

    【讨论】:

    • @Idlehands OP没有提到要生成的键值对的总数。
    • @taurus05 键的数量将根据描述是动态的,但约束是总是有两个值,其中只有一个是value2。如果条件发生变化,我们可以重新考虑这个解决方案。
    • 谢谢。我做了一些改变,现在它可以工作了!! def function(n): from random import randrange import random mydict = {} mydict = {"key" + str(i): 'value1' for i in range(1,n+1)} mydict["key"+ str (random.randrange(1,n+1))] = 'value2' return mydict
    • 你也可以只使用str(random.randrange(n)+1) :)
    【解决方案3】:

    我认为最快的方法是使用内置的dict.fromkeys() 类方法创建一个包含value1 条目的字典,然后随机更改其中一个。

    import random
    
    def function(n):
       mydict = dict.fromkeys(("key "+ str(i) for i in range(n)), 'value1')
       mydict["key "+ str(random.randrange(n))] = 'value2'  # Change one value.
       return mydict
    
    print(function(3))  # -> {'key 0': 'value1', 'key 1': 'value1', 'key 2': 'value2'}
    print(function(5))  # -> {'key 0': 'value2', 'key 1': 'value1', 'key 2': 'value1', 'key 3': 'value1', 'key 4': 'value1'}
    

    【讨论】:

    • fromkeys 比字典理解更有效吗?真的很好奇。
    • @Idlehands:我实际上并没有计时这两个,但fromkeys() 是用 C 编写的,所以可能更快。尽可能使用 Python 的内置插件通常是提高性能的好方法。
    • 你引起了我的兴趣,所以我计时了。对于使用n=1000000 试用的 100 个键的 dict 生成,fromkeys (53.68s) 和 dict comp (54.38s) 之间的性能相对可比。 IIRC 理解也使用 C 代码,所以应该是相似的。
    • @Idlehands:我想在这种特殊情况下这并不会让我感到惊讶,因为它仍在使用用户提供的(即相对缓慢的解释)Python 代码迭代地生成密钥。
    【解决方案4】:

    类似于@Idlehands,但参数化为 n 并实际返回字典

    def function(n):
        from random import randrange, randint
        mydict = {'key'+str(i):'value1' for i in range(n)}
        mydict['key'+str(randint(0,n-1))] = 'value2'
        return mydict
    
    print(function(5))
    

    【讨论】:

      【解决方案5】:

      你的问题对我来说不是很清楚,但我认为这就是你想要做的:

         from random import randrange
         mydict = {}
         value = ['value1', 'value2', 'v3', 'v4', 'v5']
      
         for i in range(5):
               key = "key " + str(i)
               mydict.update(key: value[i])
      

      您的列表必须有 5 个值长(或更多),或者您的 for 循环只需迭代两次。

      【讨论】:

        【解决方案6】:

        您可以通过 dict 理解和 numpy.random 来做到这一点:

        def create_dict(size=5):
            values = ['value_1', 'value2']
        
            # choose our index randomly
            x = lambda x: np.random.randint(1, len(values)+1)
        
            # the 1 in x() is a dummy input var
            return {"key %d"%i: values[x(1)] for i in range(size)}
        
        

        【讨论】:

          【解决方案7】:

          已经有几个选项,但这是我想出的:

          import random
          def my_function(n):
              mydict = {}
              value2_index = random.randint(0, n-1)
              for i in range(n):
                  key = "key " + str(i)
                  if i == value2_index:
                      value = ['value2']
                  else:
                      value = ['value1']
                  mydict.update({key: value})
              return mydict
          thing = my_function(5)
          print(thing)
          

          它不是最干净或最漂亮的,但我认为它有道理并且易于阅读!

          运行一次给了我:

          {'key 3': ['value1'], 'key 4': ['value1'], 'key 2': ['value1'], 'key 1': ['value2'], 'key 0': ['value1']}

          【讨论】:

            【解决方案8】:
            def randDict(n):
                from random import randint
            
                keys  = ["key"+str(i) for i in range(n)]
                values = ["value"+str(i) for i in range(n)]
                final_dict={}
                for key in keys:
                    final_dict[key]=values.pop(randint(0,n))
            
                return final_dict
            

            【讨论】:

              【解决方案9】:

              您还可以增加另一个随机性,如下所示:

              from random import randint, sample
              
              def pseudo_rand_dict(n):
                  d = dict()
                  r = randint(n, n ** n)
                  for i in range(n):
                      d[f'key_{i}'] = r
                  to_change = sample(d.keys(), 1)[0]
                  d[to_change] = randint(n, n * r)
                  return d
              
              d = pseudo_rand_dict(5)
              
              print(d)
              
              {'key_0': 2523, 'key_1': 2523, 'key_2': 2523, 'key_3': 9718, 'key_4': 2523}
              

              【讨论】:

                【解决方案10】:

                您可以先选择一个数字,然后根据索引是否等于选择的数字,使用字典推导生成所需的字典:

                def function(n):
                    pick = randrange(n)
                    return {'key %d' % i: ('value1', 'value2')[i == pick] for i in range(n)}
                

                【讨论】:

                  【解决方案11】:

                  只是为了好玩:

                  import random
                  n = 4
                  v1, v2 = 1, 2
                  res = dict(zip([ f"key{n}" for n in [x for x in range(1,n+1)] ], [ f"value{n}" for n in sorted([v1 for _ in range(n-1)] + [v2], key=lambda k: random.random()) ]))
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-05-21
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-12-08
                    相关资源
                    最近更新 更多