Ich arbeite gerade an einem Dictionary, dass bestimmte Schlüssel mit einer bestimmten Wahrscheinlichkeit zurück liefern. Leider bin ich mit dem Ansatz noch nicht ganz zufrieden. Außerdem möchte ich noch wissen, wie ich Objekte mit bestimmten Wahrscheinlichkeiten nun letztendlich ausgeben kann.
Mein Ansatz:
Code: Alles auswählen
class ProbabilityDictionary(defaultdict):
def __init__(self, *args):
defaultdict.__init__(self, list, args)
def normalize_probabilities(self):
for key, value in self.items():
probability_sum = sum([probability for successor, probability in value])
for pair in value:
#gefällt mir ganz und gar nicht
pair[0] /= float(probability_sum)
def get_probable_item(self, key):
random_float = random.random()
value = self.__getitem__(key)
random.shuffle(value)
for successor, probability in value:
if probability > random_float:
return successor
return random.choice(value)[0]
Code: Alles auswählen
probability_mapping = ProbabilityDictionary()
probability_mapping[1].append([20, 0.75])
probability_mapping[1].append([19, 0.25])
probability_mapping.normalize_probabilities()
probability_mapping.get_probable_item(1)
Edit:
Um das ganze ein bisschen benutzerfreundlicher zu machen, habe ich meiner Klasse eine weitere Methode spendiert. Hier muss der Benutzer nicht extra eine Liste anlegen, würde er ein Tupel nehmen würde es beim Normalisieren krachen. Lösung:
Code: Alles auswählen
def add_item(self, key, value, probability=1):
self[key].append([value, probability])
anogayales