如何生成一个随机字典?

3

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

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

字典中的键值对数量是否有限制? - taurus05
11个回答

5
先将所有的值都默认为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,楼主没有提到要生成的键值对的总数。 - taurus05
@taurus05 键的数量将根据描述动态变化,但限制条件是始终会有两个值,而且只有一个值是 value2。如果条件发生变化,我们可以重新审视这个解决方案。 - r.ook
谢谢。我做了一些更改,现在它可以工作了!def function(n): from random import randrange import randommydict = {} mydict = {"key " + str(i): 'value1' for i in range(1,n+1)} mydict["key "+ str(random.randrange(1,n+1))] = 'value2' return mydict - potentialwjy
你也可以使用 str(random.randrange(n)+1)。 :) - r.ook

3
你可以简单地尝试这个:
>>> 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
我认为最快的方式是使用内置的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比字典推导式更高效吗?真的很好奇。 - r.ook
1
@Idlehands:我没有实际计时过这两个函数,但是fromkeys()是用C编写的,因此可能更快。尽可能使用Python内置函数通常是提高性能的好方法。 - martineau
你引起了我的兴趣,所以我计时了一下。对于生成100个键的字典,使用n=1000000次试验,fromkeys(53.68秒)和字典推导式(54.38秒)之间的性能相对可比。如果我没记错,推导式也使用C代码,因此应该是类似的。 - r.ook
@Idlehands:我猜在这种情况下这并不让我太惊讶,因为它仍然使用用户提供的(即相对较慢的解释型)Python代码迭代生成密钥。 - martineau

1
类似于 @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))

0

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

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


0

已经有几个选择了,但这是我想出来的:

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


0
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

0

你也可以像下面这样增加另一个随机因素:

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}

0
你可以先选择一个数字,然后使用字典理解生成所需的字典,其值基于索引是否等于所选数字:
def function(n):
    pick = randrange(n)
    return {'key %d' % i: ('value1', 'value2')[i == pick] for i in range(n)}

0

只是为了好玩:

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

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