Python 如何生成随机字典?

Python 如何生成随机字典?,python,dictionary,random,Python,Dictionary,Random,我需要创建一个字典,其中包含给定范围的键值和随机值,即 {key 1: value1, key 2: value2, key 3: value1, key 4: value 1, key 5: value 1} 或 或 ……等等 如您所见,字典的模式如下: 键是根据函数的输入编号生成的,如果我输入5,我有5个键,如果我输入3,我有3个键 该值只有两个不同的值(value1和value2),但是value2只能在任意键中随机出现一次。其余值将为value1 代码: 只需先将所有值默认为val

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

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

……等等

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

  • 键是根据函数的输入编号生成的,如果我输入5,我有5个键,如果我输入3,我有3个键
  • 该值只有两个不同的值(
    value1
    value2
    ),但是
    value2
    只能在任意键中随机出现一次。其余值将为
    value1
代码:


只需先将所有值默认为
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

只需先将所有值默认为
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

您可以简单地尝试以下方法:

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

您可以简单地尝试以下方法:

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

你的问题我不太清楚,但我认为这就是你想要做的:

   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循环只需迭代两次。

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

   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循环只需迭代两次。

您可以使用
dict
理解和
numpy来完成。随机

def create_dict(大小=5):
值=['value_1','value2']
#随机选择我们的索引
x=lambda x:np.random.randint(1,len(值)+1)
#x()中的1是一个伪输入变量
为范围(大小)中的i返回{“键%d”%i:values[x(1)]}

你可以用
听写和
理解和
numpy.random来做:

def create_dict(大小=5):
值=['value_1','value2']
#随机选择我们的索引
x=lambda x:np.random.randint(1,len(值)+1)
#x()中的1是一个伪输入变量
为范围(大小)中的i返回{“键%d”%i:values[x(1)]}

已经有了一些选择,但这就是我想到的:

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


已经有了一些选择,但这就是我想到的:

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


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

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

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

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

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

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}

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

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}

我认为最快的方法是使用内置的classmethod创建一个包含
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'}

我认为最快的方法是使用内置的classmethod创建一个包含
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'}

您可以先选取一个数字,然后使用dict理解,根据索引是否等于选取的数字生成所需的dict值:

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

您可以先选取一个数字,然后使用dict理解,根据索引是否等于选取的数字生成所需的dict值:

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

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()) ]))
只是为了好玩:

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


dict中存在的键值对的数量有限制吗?dict中存在的键值对的数量有限制吗?@Idlehands OP没有提到要生成的键值对的总数。@taurus05根据描述,键值的数量是动态的,但约束条件是始终有两个值,其中只有一个值是
value2
。如果条件改变,我们可以重新使用此解决方案。谢谢。我做了一些改变,现在它工作了!!def函数(n):从random import randrange import random mydict={}mydict={“key”+str(i):'value1'表示范围(1,n+1)中的i}mydict[“key”+str(random.randrange(1,n+1))]='value2'返回mydict您也可以使用
str(random.randrange(n)+1)
还有:)@Idlehands OP没有提到要生成的键值对的总数。@taurus05键值的数量根据描述是动态的,但约束条件是总是有两个值,其中只有一个是
value2
。如果条件改变,我们可以重新使用此解决方案。谢谢。我做了一些改变,现在它工作了!!def函数(n):从random import randrange import random mydict={}mydict={“key”+str(i):'value1'表示范围(1,n+1)中的i}mydict[“key”+str(random.randrange(1,n+1))]='value2'返回mydict您也可以使用
str(random.randrange(n)+1)
还有:)fromkeys的
比听写理解更有效吗?真的很好奇。@Idlehands:我还没有对两者进行计时,但是
fromkeys()
是用C编写的,所以速度可能更快。尽可能使用Python的内置功能通常是提高性能的好方法。您激发了我的兴趣,所以我对它进行了计时。对于使用
n=1000000
试验的100个按键的dict生成,fromkeys
(53.68s)和dict comp(54.38s)之间的性能相对可比。IIRC理解也使用C代码,所以应该是类似的。@Idlehands:我想在这种情况下这不会让我太惊讶,因为它仍然使用用户提供的(即解释速度相对较慢的)Python代码迭代生成键。Is
fromkeys