我正在嘗試使用 for 回圈(i < numero_usuarios)自動生成字典,鍵取自帶有名稱的串列,值是使用 random.randint(1, 10) 隨機生成的,問題在于它并不總是產生我想要的數量。
例如,我想創建 10 個用戶(usuarios),它有時會創建 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)
uj5u.com熱心網友回復:
在字典中,一個鍵不能多次出現,所有嘗試插入一個已經存在的鍵都會導致覆寫存盤的值。
random.choice,作為有替換的平局,可以多次回傳同一個用戶。您需要使用random.sample,它無需替換即可模擬平局:
for nombre in random.sample(self.nombres, numero_usuarios):
self.usuarios[nombre] = random.randint(1, 10)
uj5u.com熱心網友回復:
問題是有時“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)
謝謝,希望它對我有用,因為它對我有用!
uj5u.com熱心網友回復:
這是因為一次隨機選擇一個時,您的字典中會出現重復的鍵。
您可以使用以下命令生成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))
uj5u.com熱心網友回復:
我認為問題是有時,在選擇一個隨機名稱時 - 該名稱可能已經在字典中。為什么不從一開始就隨機化名稱,并在將它們添加到 dict 時將它們從串列中洗掉?
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 總是回傳一個類的實體。我認為上面的這段代碼可以實作你想要的?或者,制作一個“工廠”函式來生成具有不同屬性的物件的許多實體,而不是將其作為方法,可能會很好。只是一個想法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/322689.html
