1
votes

Est-il nécessaire de faire 50 classes différentes pour chaque état des USA?

Je travaille sur un générateur simple qui crache 1 état aléatoire aux États-Unis, suivi d'une ville et d'un code postal de cet état, je veux que mon RNG ait au moins 10 villes parmi lesquelles choisir. (suivi du zip codes de cette ville) Dois-je vraiment créer 50 classes différentes pour chaque état et fournir 10 méthodes pour chaque classe? Chaque méthode renvoie simplement le texte à l'utilisateur. Rien de spécial. Mais j'ai l'impression qu'il y a quelque chose qui ne va pas ici. Je sais qu'il existe un moyen plus simple de le faire avec moins de lignes de code. Ai-je tort? Veuillez regarder la partie de mon code si vous êtes confus.

Comment suis-je supposé obtenir seulement 1 sortie de 50 classes différentes? Puis-je créer un tableau de toutes les classes puis faire random.choice () Je ne veux pas écrire une tonne de code sans raison donc je n'ai fourni qu'un Newyork classe avec 3 méthodes. Mais faisons comme si j'avais 50 de ces classes avec 10 méthodes

import tkinter as tk
import random


class Newyork:

def bronx(self):
    bronx_zips = [10453, 10457, 10460, 10451, 10474]
    random_bronx_zips = random.choice(bronx_zips)
    new_bronx_zip = "Bronx NY,", random_bronx_zips
    return new_bronx_zip

def albany(self):
    albany_zips = [12084, 12201, 12202, 12203, 12204]
    random_albany_zips = random.choice(albany_zips)
    new_albany_zip = 'Albany NY,', random_albany_zips
    return new_albany_zip

def buffalo(self):
    buffalo_zips = [14201,14202, 14203, 14204, 14205]
    random_buffalo_zip = random.choice(buffalo_zips)
    new_buffalo_zip = 'Buffalo NY', random_buffalo_zip
    return new_buffalo_zip

newyork = Newyork()

def random_NY_output():
   NY_methods = [newyork.bronx(), newyork.albany(),newyork.buffalo()]
   random_ny_output = random.choice(NY_methods)
   return random_ny_output

def update_entry():
    locationstate_entry.delete(0, tk.END)
    locationstate_entry.insert(0, random_NY_output())

button = tk.Button(root, text="Generate", command=update_entry, activebackground="blue")

Comme vous pouvez le voir, la fonction random_NY_output () crache juste tout ce dont j'ai besoin pour connaître la classe newyork. Cela me donne 1 sortie aléatoire. Mais comme je l'ai dit, je n'ai besoin que d'une sortie de 50 classes différentes. Comment cela peut-il être fait?


3 commentaires

Non, vous n'auriez pas de classes séparées pour chaque état, mais vous ne devriez pas non plus avoir de méthodes distinctes pour chaque ville. Qu'essayez-vous de faire?


@DanielRoseman J'essaie juste de générer 1 sortie. Je veux un état aléatoire. Avec une ville et un code postal suivis


Cette conception est horrible (rien de personnel). Le but d'une classe est de servir de modèle abstrait pour des objets concrets. Ce que vous voulez, c'est class State et 50 instances de cette classe.


4 Réponses :


-1
votes

Au lieu d'écrire des classes, utilisez des dictionnaires:

zips = {
    'NY': {
        "Bronx NY":[10453, 10457, 10460, 10451, 10474],
        'Albany NY': [12084, 12201, 12202, 12203, 12204],
        'Buffalo NY': [14201,14202, 14203, 14204, 14205],
    },
}
location = random.choice(list(zips['NY'].keys()))
zip = random.choice(zips['NY'][location])


2 commentaires

Pourquoi est-ce mieux que d'utiliser une classe personnalisée?


Et comment cela résout-il le problème du choix entre plusieurs états?



0
votes

Au lieu d'utiliser une classe différente pour chaque état, créez un dictionnaire contenant toutes vos informations. Ensuite, vous pouvez générer vos chaînes en fonction de cela et coder en dur moins d'informations.

>>> def choose_from(dictionary):
...     key = random.choice(list(dictionary.keys()))
...     return key, dictionary[key]
... 
>>> def random_city_state_zip():
...     state, cities = choose_from(states)
...     city, zip_codes = choose_from(cities)
...     zip_code = random.choice(zip_codes)
...     return state, city, zip_code
... 
>>> random_city_state_zip()
('NY', 'Albany', 12203)
>>> random_city_state_zip()
('NY', 'Bronx', 10457)

Si c'était mon code, j'écrirais une fonction pour cela (avec une fonction d'assistance):

>>> import random
>>> states = {
...   'NY': {
...     'Albany': [12084, 12201, 12202, 12203, 12204],
...     'Bronx': [10453, 10457, 10460, 10451, 10474],
...     'Buffalo': [14201,14202, 14203, 14204, 14205]
...   }
... }
>>> state = random.choice(list(states.keys()))
>>> state
'NY'
>>> cities = states[state]
>>> cities
{'Albany': [12084, 12201, 12202, 12203, 12204], 'Bronx': [10453, 10457, 10460, 10451, 10474], 'Buffalo': [14201, 14202, 14203, 14204, 14205]}
>>> city = random.choice(list(cities.keys()))
>>> city
'Bronx'
>>> zips = cities[city]
>>> zips
[10453, 10457, 10460, 10451, 10474]
>>> zip_code = random.choice(zips)
>>> zip_code
10460
>>> city, state, zip_code
('Bronx', 'NY', 10460)


6 commentaires

Pourquoi est-ce mieux que d'utiliser une classe personnalisée?


J'utiliserais toujours une classe à n'importe quel niveau que vous allez créer et l'appeler le plus, mais j'exécuterais la logique sous-jacente de cette façon pour vous simplifier la vie. Au lieu d'avoir à créer une nouvelle fonction pour chaque ville, vous pouvez simplement obtenir les informations nécessaires et avoir une fonction partagée rassembler les données pour vous dans le format que vous voulez.


Oh, je viens de voir que vous vouliez aussi un état aléatoire. Donc, je voudrais plutôt envelopper cela dans une classe qui choisit un état aléatoire, choisit une ville au hasard dans cet état et choisit un code postal aléatoire dans cet état.


@BrettBeatty Je veux un zip aléatoire de la ville. Pas état


ville, état aléatoire, code postal Exemple: Albany NY, 12084


Ouais, je voulais dire ville, pas état. Et vous pouvez utiliser les informations comme vous le souhaitez. J'ai inclus un exemple de fonction qui les renvoie sous forme de tuple.



0
votes

Étant donné que chaque État se comporte de la même manière que tous les autres États et que chaque ville se comporte de la même manière que toutes les autres villes, la seule vraie différence réside dans les données propres à chaque ville ou État (noms, codes postaux).

Vous pouvez créer une classe unique qui prend des arguments qui définissent les choses uniques à un état, comme le nom et l'abréviation. Les villes peuvent être un attribut de l'état qui sont soit ajoutés avant, après ou pendant la création de l'état.

Par exemple:

new_york = State("New York", "NY", cities = [
    City("Albany", zips=[12084, 12201, 12202, 12203, 12204]),
    City("Bronx", zips=[0453, 10457, 10460, 10451, 10474]),
])

ou ceci:

albany = City("Albany", zips=[12084, 12201, 12202, 12203, 12204])
bronx = City("Bronx", zips=[0453, 10457, 10460, 10451, 10474])
new_york = State("New York", "NY", cities=[albany, bronx])

ou les combiner avec ceci:

new_york = State("New York", "NY")
new_york.add_city("Albany", zips=[12084, 12201, 12202, 12203, 12204])
new_york.add_city("Bronx", [0453, 10457, 10460, 10451, 10474])

Vous pouvez ensuite ajouter vos méthodes de choix aléatoires dans un générique façon, car ils ont juste à tirer de self.zips pour une ville, ou de self.cities pour un état. Ou, vous pouvez parcourir chaque État et / ou chaque ville d'un État. Tout cela est assez simple et dépend de ce que vous devez faire.

Le but étant de créer des classes d'état et / ou de ville génériques et des méthodes génériques qui choisissent parmi les données uniques pour chaque instance.


0 commentaires

0
votes

Pour autant que je sache d'après votre exemple de code publié, votre exigence est de fournir à plusieurs reprises un tuple ("City ST", zip) aléatoire à partir d'un ensemble prédéfini de telles valeurs.

p> Cela n'a même pas besoin d'une seule classe, car il ne fait rien de classe. (Voici une vidéo bonus sur le fait de ne pas écrire de cours: Arrêtez d'écrire des cours .) P >

Faites simplement une grande liste de tuples et utilisez random.choice (ou .shuffle si cela a plus de sens pour votre application globale) pour faire le travail:

_places = []
_places.extend((("Albany NY", zip) for zip in (12084, 12201, 12202, 12203, 12204))
_places.extend((("Bronx NY", zip) for zip in (10453, 10457, 10460, 10451, 10474))
_places.extend((("Buffalo NY", zip) for zip in (14201,14202, 14203, 14204, 14205))
# Many, many lines omitted...

def random_place():
    return random.choice(_places)

def update_entry():
    locationstate_entry.delete(0, tk.END)
    locationstate_entry.insert(0, random_place())


2 commentaires

J'ai une ligne comme celle-ci Newjersey.extend (("Syracuse1 NY", zip) pour zip dans [08732, 08735, 08751, 08753, 08754, 08755, 08756]) Il semble que cela ne fonctionne pas car tous les codes postaux commencent par un zéro. Pourquoi reçois-je une erreur "jeton non valide"


Ça ne fait rien. Je l'ai compris. Je viens de convertir les codes postaux commençant par 0 en octal. Puis vient d'ajouter "0" suivi d'un +