生成字典并不总是有效



我试图用for循环自动生成一个字典(I <Numero_usuarios),键是从带有名称的列表中获取的,值是随机生成的。randint(1,10),问题是它并不总是生成我想要的数量。>

例如,我想创建10个用户(通常情况下),它有时会创建7、8或9个,但很少创建10个。

下面的代码。

import random
class practica6:
#Create our constructor
def __init__(self) -> None:
# Initialize users dictionary
self.usuarios = {}
#List of possible names the users can take
self.nombres = ['Mario', 'Pepe', 'Angel', 'Joaquin', 'Jesus', 'Edson', 'Emilio', 
'Eli', 'Francisco', 'Sergio', 
'Erick', 'David', 'Liam', 'Noah', 'Oliver', 'William', 'James', 'Benjamin', 'Lucas', 
'Henry', 'Alexander', 
'Mason', 'Michael', 'Ethan', 'Mateo', 'Sebastian', 'Jack', 'Peter', 'Josh', 
'Patricia', 'Luis', 'Gerardo', 'Carmen']

def generar_diccionario_usuarios(self, numero_usuarios : int):
#Generate a dictionary with random names (keys) and random priority (values) keys : 
#values
for i in range(numero_usuarios):
self.usuarios[random.choice(self.nombres)] = random.randint(1, 10)
#DEBUG : Print our users dictionary
print(self.usuarios)
#Test app
practica = practica6()
n = 10
print('Usuarios:')
practica.generar_diccionario_usuarios(n)

在字典中,一个键不能出现多次,并且所有插入已经存在的键的尝试都会导致覆盖存储的值。random.choice,与为平局替换,可多次返回同一用户. 您需要使用random.sample,它模拟没有的绘制。替换:

for nombre in random.sample(self.nombres, numero_usuarios):
self.usuarios[nombre] = random.randint(1, 10)

这是因为每次随机选择一个键时,字典中会有重复的键。

您可以使用

生成numero_usarios不同键的列表
distinct_names = random.sample(self.nombres, k=numero_usarios)

和带有

的随机整数列表
values = random.choices(range(1, 11), k=numero_usarios)
然后,您可以通过将这些列表与 配对来构建字典。
self.usuarios =  dict(zip(distinct_names, values))

问题是有时"random.choice(self.nombres)"生成了相同的名字,所以它是重叠的,所以解决方案是:

import random
class practica6:
#Create our constructor
def __init__(self) -> None:
# Initialize users dictionary
self.usuarios = {}
#List of possible names the users can take
self.nombres = ['Mario', 'Pepe', 'Angel', 'Joaquin', 'Jesus', 'Edson', 'Emilio', 
'Eli', 'Francisco', 'Sergio', 
'Erick', 'David', 'Liam', 'Noah', 'Oliver', 'William', 'James', 'Benjamin', 'Lucas', 
'Henry', 'Alexander', 
'Mason', 'Michael', 'Ethan', 'Mateo', 'Sebastian', 'Jack', 'Peter', 'Josh', 
'Patricia', 'Luis', 'Gerardo', 'Carmen']

def generar_diccionario_usuarios(self, numero_usuarios : int):
#Generate a dictionary with random names (keys) and random priority (values) keys : 
#values
for i in range(numero_usuarios):
name = random.choice(self.nombres)
while name in self.usuarios.keys():
name = random.choice(self.nombres)
self.usuarios[name] = random.randint(1, 10)
#DEBUG : Print our users dictionary
print(self.usuarios)
#Test app
practica = practica6()
n = 10
print('Usuarios:')
practica.generar_diccionario_usuarios(n)

谢谢你,希望它的工作,因为它为我工作!

我认为问题是有时,当选择一个随机名称时-该名称可能已经在字典中了。为什么不从一开始就随机化这些名字,当它们被添加到字典中时,从列表中删除它们呢?

import random
class Practica6:
def __init__(self) -> object:
# Initialize users dictionary
self.usuarios = {}
#List of possible names the users can take- shuffled
self.nombres = random.shuffle(['Mario', 'Pepe', 'Angel', 'Joaquin', 'Jesus', 'Edson', 'Emilio', 
'Eli', 'Francisco', 'Sergio', 
'Erick', 'David', 'Liam', 'Noah', 'Oliver', 'William', 'James', 'Benjamin', 'Lucas', 
'Henry', 'Alexander', 
'Mason', 'Michael', 'Ethan', 'Mateo', 'Sebastian', 'Jack', 'Peter', 'Josh', 
'Patricia', 'Luis', 'Gerardo', 'Carmen'])

def generar_diccionario_usuarios(self, numero_usuarios : int):
#Generate a dictionary with random names (keys) and random priority (values) keys : 
#values
for i in range(numero_usuarios):
chosen = self.nombres.pop() # random.choice(self.nombres)
self.usuarios[chosen] = random.randint(1, 10)
#DEBUG : Print our users dictionary
print(self.usuarios)

#Test app
practica = Practica6()
n = 5
print('Usuarios:')
practica.generar_diccionario_usuarios(n)

init总是返回类的一个实例。我认为这个代码上面可以实现你正在寻找什么?另一种可能是,建立一个"工厂"也不错。函数生成具有不同属性的对象的多个实例,而不是将其作为方法使用。只是一个想法。

最新更新