J'ai une liste de plus de 100 objets et j'aimerais sélectionner 5 objets aléatoires et les stocker dans des variables, mais je ne sais pas comment faire cela. Que faire? Ceci est une version simplifiée de mon code:
class playableCharacters:
def __init__(self, name, power)
self.name = name
self.power = power
Aatrox = playableCharacters("Aatrox", 9)
Ahri = playableCharacters("Ahri", 3)
3 Réponses :
Vous pouvez créer une liste statique et pousser l'objet dans cette liste sur __init__ , puis vous pouvez obtenir 5 int aléatoires et ils peuvent être utilisés comme index de cette liste statique.
Comme ceci:
import random
class playableCharacters:
instances = []
def __init__(self, name, power):
self.name = name
self.power = power
__class__.instances.append(self)
Aatrox = playableCharacters("Aatrox", 9)
Ahri = playableCharacters("Ahri", 3)
# 100 more instances declaration.
randIndex = random.randrange(len(playableCharacters.instances))
randPlayerCharacter = playableCharacters.instances[randIndex]
print(randPlayerCharacter.name)
Comme ceci, vous pouvez obtenir 4 instances aléatoires supplémentaires.
Et s'il en voulait plus de 5? Vous devez automatiser le processus d'obtention d'un nombre n d'objets aléatoires.
Étonnant que nous ayons trouvé presque la même solution indépendamment. Mais je pense que vous ne pourrez pas accéder aux instances de l'intérieur de __init__ et donc ce code peut ne pas fonctionner.
Il n'en veut que 5 pour le moment.
@najeem pourquoi pas?
Parce que j'ai essayé cela en premier et j'ai obtenu un NameError . Puis réalisé que instances n'est pas dans la portée de __init__ .
Est-ce que ça importe? Je vois maintenant que vous avez modifié votre code :)
Je suis désolé, mais j'ai du mal à obtenir les autres caractères aléatoires, chaque fois que j'essaye, il n'imprime qu'un seul caractère aléatoire, comment puis-je le faire imprimer plus d'un? : /
@RadRazvan, Exactement, Ce code ne générera qu'un seul caractère aléatoire, 4, par contre, je vous ai laissé générer. Pour que vous puissiez apprendre quelque chose.
Vous pouvez le résoudre avec une liste de classes
import random random5 = random.choices(playableCharacters.instances, k=5)
Maintenant, vous pouvez obtenir un ensemble de 5 instances d'objets aléatoires comme
class playableCharacters:
instances = []
def __init__(self, name, power):
self.name = name
self.power = power
__class__.instances.append(self)
a = playableCharacters("a", 9)
b = playableCharacters("b", 3)
c = playableCharacters("c", 9)
d = playableCharacters("d", 3)
# and so on.....
Je ne sais pas si c'est la manière la plus optimale si vous avez des milliers d'instances de la même classe.
Le nom d'impression était juste pour montrer que cela fonctionne. Vous pouvez également attribuer le choix aléatoire à une variable et accéder à toutes les propriétés.
Que diriez-vous d'utiliser random.choices (object_list, k = n) où n = nombre d'éléments aléatoires:
import random
class playableCharacters:
def __init__(self, name, power):
self.name = name
self.power = power
# Displays name when printed
def __repr__(self):
return (self.name)
objects_to_be_created = {'Aatrox':9,'Ahri':3,'Test':5,'Test2':1,'Test3':5}
myCharacters = []
# Automatation
for o in objects_to_be_created:
x = playableCharacters(o, objects_to_be_created[o])
myCharacters.append(x)
# K=5 gives a list of 5 random
randomObjects = random.choices(myCharacters, k=5)
print(randomObjects)
EDIT: Voici une version automatisée. Utilisez un dictionnaire pour représenter le nom et les paires valeur / clé d'alimentation:
import random
class playableCharacters:
def __init__(self, name, power):
self.name = name
self.power = power
# Displays name when printed
def __repr__(self):
return (self.name)
# 5 Objects created
Aatrox = playableCharacters("Aatrox", 9)
Ahri = playableCharacters("Ahri", 3)
Test = playableCharacters("Test", 5)
Test2 = playableCharacters("Test2", 1)
Test3 = playableCharacters("Test3", 5)
# You could automate this, but for now here is a list of objects
myCharacters = [Aatrox, Ahri, Test, Test2, Test3]
# K=5 gives a list of 5 random
randomObjects = random.choices(myCharacters, k=5)
print(randomObjects)
Comme OP l'a dit, il peut y avoir plus de 100 instances. Comment cette chose peut-elle être automatisée? Un indicateur à cela?
En supposant que vos objets sont instanciés via une boucle, vous pouvez les ajouter à la liste myCharacters à chaque fois qu'ils sont créés.