CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Python] s'assurer que 2 objets n'ont pas les memes valeurs

Pseudo supprimé
Pseudo supprimé 24 février 2019 à 18:30:51

Bonjour,

Voila mon code:

m_name_list = ["James", "John", "Robert", "Michael", "William"]

l_name_list = ["Smith", "Johnson", "Williams", "Jones", "Brown"]

character_list = []

class CHARACTER:
	def __init__ (self, surname, name):
		self.surname = surname
		self.name = name

for x in 5:
	character = CHARACTER(random.choice(m_name_list), random.choice(l_name_list))
	character_list.append(character)

l'idee est de creer une liste de 5 personnages avec des noms aleatoires.
Je voudrais cependant m'assurer que 2 personnages ne puisse pas avoir la meme combinaison nom+prenom
Quel serait la maniere la plus elegante de faire ca?

Merci

ThisIsLafleche
ThisIsLafleche
Niveau 3
24 février 2019 à 20:18:45

T'as qu'a te faire une liste avec toutes les combinaisons des noms et tu pick randomly sans remise :


Python 3.7.2 (default, Feb 10 2019, 13:32:21) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> m_name_list = ["James", "John", "Robert", "Michael", "William"]
>>> l_name_list = ["Smith", "Johnson", "Williams", "Jones", "Brown"]
>>> results = []
>>> for firstname in m_name_list:
...     for lastname in l_name_list:
...             results.append(f'{firstname} {lastname}')
... 
James Smith
James Johnson
James Williams
James Jones
James Brown
John Smith
John Johnson
John Williams
John Jones
John Brown
Robert Smith
Robert Johnson
Robert Williams
Robert Jones
Robert Brown
Michael Smith
Michael Johnson
Michael Williams
Michael Jones
Michael Brown
William Smith
William Johnson
William Williams
William Jones
William Brown

>>> import random
>>># 5 c'est le nombre d'items différents que tu veux dans ta liste
>>> random.sample(results, 5)

TheRealMarco
TheRealMarco
Niveau 13
24 février 2019 à 20:29:16
import random

# aléatoirise l'ordre.
m_name_list  = random.shuffle(m_name_list)
l_name_list = random.shuffle(l_name_list)

# Renvoie des tuples
character_list = [(m_name_list [i], l_name_list [i]) for i in range(0, len(m_name_list))] 

C'est clairement pas une méthode élégante, mais ça marche dans ton exemple car tu vas avoir une liste de tuple de la longueur de la première liste.

Sinon, tu peux faire une énumération de tous les cas possibles (O(n)). Le faire dans un set(), te permet, à l'inverse d'une list() de ne pas ajouter un élément s'il est déjà présent.

combinaisons = set()

for surname in m_name_list :
   for name in l_name_list :
      combinaisons.add(tuple(surname, name))

for x in combinaisons :
   character = CHARACTER(x[0], x[1])
      character_list.append(character)

PS : C'est surement mal indenté car j'écris direct sur JVC.

Grimmys
Grimmys
Niveau 19
24 février 2019 à 21:05:52

Avec ta première solution TheRealMarco tu n'évites pas simplement les combinaisons identiques, mais aussi les prénoms / noms identiques (exemple : tu ne peux pas tirer James Smith et James Johnson)... Je ne crois pas que ce soit ce que voulait l'auteur.

Perso j'imaginais un truc plus orienté objet et plus " rigoureux " peut-être... Mais bon je pense que je complexifie beaucoup trop la tâche pour rien par rapport aux autre codes fonctionnels que vous avez proposé TheRealMarco et ThisIsLaFleche. :(

Je la montre quand même, parce que j'aime bien résoudre de " petits problèmes comme ça " en Python. :hap:

En repartant du code de l'auteur :


m_name_list = ["James", "John", "Robert", "Michael", "William"]

l_name_list = ["Smith", "Johnson", "Williams", "Jones", "Brown"]

character_list = []

class CHARACTER:
    def __init__ (self, surname, name):
        self.surname = surname
        self.name = name
  
    def isEqualTo(self, other_character):
        if self.surname == other_character.surname and self.name == other_character.name:
            return false
        return true

for x in 5:
    character = CHARACTER(random.choice(m_name_list), random.choice(l_name_list))
    for char in character_list:
        if char.isEqualTo(character):
            break    
    else:
        character_list.append(character)
Message édité le 24 février 2019 à 21:06:54 par Grimmys
Pseudo supprimé
Pseudo supprimé 24 février 2019 à 22:27:36

Merci pour vos reponses.
Sans vouloir rentrer dans les details la manière dont mon code fonctionne fait que la vérification devrait etre faite apres que les noms aient ete attribués.

J’avais pensé faire un truc du genre:

x=0
y=1
while x< len(character_list):
           if character_list[x].surname == character_list[y].surname and character_list[x].name == character_list[y].name:
                character_list[x].surname = random.choice(m_name_list)
                x=0
                Y=1
            else:
                y+=1
                if y>=len(character_list):
                    x+=1
                    y=1

Mais c’est pas forcément génial au niveau optimisation

Message édité le 24 février 2019 à 22:29:43 par Pseudo supprimé
Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment