Memorizzazione dizionari generati casualmente in Python

voti
-1

Ho una serie di funzioni che finiscono per dare un elenco, con il primo elemento che contiene un numero, derivato dai dizionari, e il secondo e terzo Gli articoli sono dizionari.

Questi dizionari sono stati generati in precedenza in modo casuale.

La funzione che sto usando genera un certo numero di questi dizionari, cercando di ottenere il maggior numero possibile in quanto la prima voce. (E 'progettato per ottimizzare il lancio dei dadi).

Tutto questo funziona bene, e posso stampare il valore del più alto prima voce da tutte le iterazioni. Tuttavia, quando provo e stampare i due dizionari associati a questo primo numero (tenendo a mente che sono tutti in una lista insieme), si genera solo apparentemente in modo casuale gli altri due dizionari.

def repeat(type, times):
    best = 0
    for i in range(0, times):
        x = rollForCharacter(type)
        if x[0] > best:
            print(BEST:, x)
            best = x[0]

    print(The highest average success is, best)

    return best

Questa grande opera. L'ultima cosa è indicato:

BEST: (3.58, [{'strength': 4, 'intelligence': 1, 'charisma': 1, 'stamina': 4, 'willpower': 2, 'dexterity': 2, 'wits': 5, 'luck': 2}, {'agility': 1, 'brawl': 2, 'investigation': 3, 'larceny': 0, 'melee': 1, 'survival': 0, 'alchemy': 3, 'archery': 0, 'crafting': 0, 'drive': 1, 'magic': 0, 'medicine': 0, 'commercial': 0, 'esteem': 5, 'instruction': 2, 'intimidation': 2, 'persuasion': 0, 'seduction': 0}]) The highest average success is 3.58

Ma se provo qualcosa per memorizzare la lista che ha dato questo numero:

def repeat(type, times):
    best = 0
    bestChar = []
    for i in range(0, times):
        x = rollForCharacter(type)
        if x[0] > best:
            print(BEST:, x)
            best = x[0]
            bestChar = x

    print(The highest average success is, best)
    print(Therefore the best character is, bestChar)

    return best, bestChar

Ottengo questo come l'ultimo risultato, che va bene:

BEST: (4.15, [{'strength': 2, 'intelligence': 3, 'charisma': 4, 'stamina': 4, 'willpower': 1, 'dexterity': 2, 'wits': 4, 'luck': 1}, {'agility': 1, 'brawl': 0, 'investigation': 5, 'larceny': 0, 'melee': 0, 'survival': 0, 'alchemy': 7, 'archery': 0, 'crafting': 0, 'drive': 0, 'magic': 0, 'medicine': 0, 'commercial': 1, 'esteem': 0, 'instruction': 3, 'intimidation': 0, 'persuasion': 0, 'seduction': 0}]) The highest average success is 4.15

ma l'ultima riga è

Therefore the best character is (4.15, [{'strength': 1, 'intelligence': 3, 'charisma': 4, 'stamina': 4, 'willpower': 1, 'dexterity': 2, 'wits': 2, 'luck': 3}, {'agility': 1, 'brawl': 0, 'investigation': 1, 'larceny': 4, 'melee': 2, 'survival': 0, 'alchemy': 2, 'archery': 4, 'crafting': 0, 'drive': 0, 'magic': 0, 'medicine': 0, 'commercial': 1, 'esteem': 0, 'instruction': 0, 'intimidation': 2, 'persuasion': 1, 'seduction': 0}])

Come si può vedere questo valore non coincide con quello che voglio, e ciò che viene stampato letteralmente sopra di esso.

Attraverso un po 'di controllo, ho capito quello che dà fuori come il Miglior personaggio è solo l'ultimo generato, che non è il migliore, solo la più recente. Tuttavia, non è così semplice, perché il primo elemento è il risultato più alto che è stata registrata, non solo dal carattere nel resto della lista. Questo è davvero fonte di confusione perché significa la lista è in qualche modo in fase di modifica, ma in nessun punto posso vedere dove che sarebbe accaduto.

Sto facendo qualcosa di stupido per cui il personaggio è generato in modo casuale ogni volta? Io non la penso così dal momento che x[0]dà il risultato corretto e memorizzato bene, così che cosa cambia quando è la lista completa?

Dalla funzione rollForCharacter () restituisce rollResult, characterche è solo il numero e poi i due dizionari.

Le sarei molto grato se qualcuno riusciva a capire e spiegare dove sto andando male e perché è in grado di stampare la risposta corretta alla console ma non conservarlo correttamente una linea qui sotto!

MODIFICARE:

Dizionario 1 Codice:

attributes = {}


def assignRow(row, p): # p is the number of points you have to assign to each row
    rowValues = {}
    for i in range(0, len(row)-1):
        val = randint(0, p)
        rowValues[row[i]] = val + 1
        p -= val
    rowValues[row[-1]] = p + 1
    return attributes.update(rowValues)


def getPoints():
    points = [7, 5, 3]
    shuffle(points)
    row1 = ['strength', 'intelligence', 'charisma']
    row2 = ['stamina', 'willpower']
    row3 = ['dexterity', 'wits', 'luck']
    for i in range(0, len(points)):
        row = eval(row + str(i+1))
        assignRow(row, points[i])

Dizionario 2 Codice:

skills = {}


def assignRow(row, p):  # p is the number of points you have to assign to each row
    rowValues = {}
    for i in range(0, len(row) - 1):
        val = randint(0, p)
        rowValues[row[i]] = val
        p -= val
    rowValues[row[-1]] = p
    return skills.update(rowValues)


def getPoints():
    points = [11, 7, 4]
    shuffle(points)
    row1 = ['agility', 'brawl', 'investigation', 'larceny', 'melee', 'survival']
    row2 = ['alchemy', 'archery', 'crafting', 'drive', 'magic', 'medicine']
    row3 = ['commercial', 'esteem', 'instruction', 'intimidation', 'persuasion', 'seduction']
    for i in range(0, len(points)):
        row = eval(row + str(i + 1))
        assignRow(row, points[i])
È pubblicato 28/07/2017 alle 07:34
dall'utente
In altre lingue...                            


1 risposte

voti
1

Lo fa apparire come il dizionario viene ri-generata, che potrebbe facilmente accadere se la funzione rollForCharacterrestituisce un generatore o in alternativa è sovrascrivere una variabile globale che viene sovrascritta da un successivo ciclo del ciclo.

Un modo semplice ma hacky per risolvere il problema sarebbe di prendere una copia completa del dizionario al momento della memorizzazione, in modo che si è sicuri si stanno tenendo i valori in quel punto:

def repeat(type, times):
    best = 0
    bestChar = []
    for i in range(0, times):
        x = rollForCharacter(type)
        if x[0] > best:
            print("BEST:", x)
            best = x[0]
            # Create a brand new tuple, containing a copy of the current dict
            bestChar = (x[0], x[1].copy())

La risposta corretta sarebbe comunque per passare una variabile dizionario unico che non è influenzata da codice in seguito.

Vedere questo SO rispondere con un contesto po 'di più su come passare un riferimento a un dizionario può essere rischioso in quanto è ancora un oggetto mutabile.

Risposto il 28/07/2017 a 07:53
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more