5
votes

Comment puis-je sélectionner un objet aléatoire dans une classe?

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)


0 commentaires

3 Réponses :


3
votes

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.


8 commentaires

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.



0
votes

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.


1 commentaires

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.



0
votes

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)


2 commentaires

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.