elenco indici devono essere numeri interi, non str

ho 2 tipi di elenchi: i nomi e i punteggi e sto cercando di combinare i punteggi in modo che tutti i punteggi sono combinati in un elenco esistente

Continuo a ricevere la “lista gli indici devono essere interi, non str” errore

name1= [jim, bob, john, smith]

score1= [4,7,3,11]

name2= [bob, cahterine, jim, will, lucy]

score2= [6,12,7,1,4]

Voglio che il risultato sia:

name1 = [jim, bob, john, smith, catherine, will, lucy]

score2 = [11, 13 ,3 ,11 ,12 ,1 ,4]


def merge(name1,score1, name2,score2):

     for i in name2:
        if i in name1:
           indexed= name1.index(i)
           score2[i] =score1[int(indexed)]+score2[i]
        if i not in name1:
           name1.append(i)
           score1.append(score2[(name1.index(i))])
  • Perché non ti unisci a loro, semplicemente: name1 = name1 + name2 e score2 = score1 + score2?
  • icanc: OP vogliono i punteggi combinati per nome. Che è, la lista risultante deve avere solo una voce per ogni nome, e un punteggio pari alla somma dei punteggi associati con il nome di elenchi di immissione.
  • Ah, grazie per il chiarimento.

 

5 Replies
  1. 9

    Si hanno punteggi che sono concettualmente associati con nomi. Questo ti dice che sei un errato struttura di dati. In particolare, i numeri rappresentano i punteggi che si sta andando ad essere l’aggiunta di fino, o, più precisamente, conteggio up.

    Python ha un built-in strumento per questo.

    from collections import Counter
    
    results_1 = Counter(jim = 4, bob = 7, john = 3, smith = 11)
    results_2 = Counter(bob = 6, catherine = 12, jim = 7, will = 1, lucy = 4)
    
    results_1 + results_2 # yes, it's really this easy.

    Per il tuo messaggio di errore, significa esattamente quello che dice, e @BryanOakley già spiegato abbondantemente. Ma devo sottolineare che in programmazione, è necessario essere precisi e coerenti, e costantemente prestare attenzione ai dettagli. Buone abitudini di evitare questi errori, perché si sono costantemente pensando esattamente cosa si sta facendo e esattamente cosa significa. Stile convenzioni di aiuto, anche:

    • Nome iteratore dopo la cosa che in realtà contiene. Dal momento che, in Python, scorrere un elenco in realtà ti dà gli elementi dall’elenco (non intero gli indici di borsa), utilizzare un nome che suggerisce un effettivo elemento di elenco, e non qualcosa di blando come i.

    • Nome elenchi e altri contenitori con un nome plurale, in modo che il codice, naturalmente, descrive quello che succede. Quindi, scrivere le cose come for name in names:.

    Ma dico “attenzione ai dettagli” perché

    • Quando si registra il codice, non il tipo di fuori; copia e incolla in modo che siamo in grado di vedere esattamente ciò che hai.

    • Ortografia conta. Errori di battitura male (cahterine).

    • Stringhe virgolette intorno a loro. Non ottenere stringhe confuso con i nomi delle variabili.

  2. 9

    Si può considerare l’immissione di dati in Contatore classe da collezioni modulo. Per esempio:

    #! /usr/bin/env python
    from collections import Counter
    
    name1 = ["jim", "bob", "john", "smith"]
    score1 = [4,7,3,11]
    name2 = ["bob", "cahterine", "jim", "will", "lucy"]
    score2 = [6,12,7,1,4]
    
    first_set = dict(zip(name1, score1))
    second_set = dict(zip(name2, score2))
    
    print Counter(first_set) + Counter(second_set)

    Questo viene stampato il seguente:

    Counter({'bob': 13, 'cahterine': 12, 'jim': 11, 'smith': 11, 'lucy': 4, 'john': 3, 'will': 1})

    Inoltre, guarda Karl risposta. Semplifica ancora di più.

    • +1 per la buona struttura dati scelta, mi picchiava per il pugno da un paio di minuti.
    • Non avete bisogno di un intermedio dict, basta fare Counter(zip(name1, score1)) etc.
    • Sì, ma si avrebbe bisogno Counter(dict(zip(name1, score1))). Ho solo voluto mostrare la procedura per l’OP così sarebbe più facile da seguire. Si può semplificare il tutto molto di più, e, naturalmente, come in Karl risposta.
  3. 5

    Fiducia nel messaggio di errore: sta dicendo esattamente che cosa il problema è. Quando si esegue score2[i], chiedetevi: “che cosa sono io?”

    In questo contesto, vi è un elemento di nome2. Anche se il codice di esempio mostra come [bob, cahterine, jim, will, lucy], sto cercando di indovinare chi sono delle stringhe.

  4. 0

    ho ottenuto questo lavoro, ma non so se è quello che stai cercando?

    name1= ['jim', 'bob', 'john', 'smith']
    name2= ['bob', 'cahterine', 'jim', 'will', 'lucy']
    score1= [4,7,3,11]
    score2= [6,12,7,1,4]
    def merge (name1,score1, name2,score2):
        for x in range(0,len(name1)):
            name2.append(name1[x])
        for x in range(0,len(score1)):
            score2.append(score1[x])
        print name2
        print score2
    merge(name1,score1, name2,score2)
  5. 0
    def sum(index, name):
        score2[index] += score1[name1.index(name)]
    
    
    name1= ["jim", "bob", "john", "smith"]
    score1= [4,7,3,11]
    name2= ["bob", "cahterine", "jim", "will", "lucy"]
    score2= [6,12,7,1,4]
    
    [sum(index, _name) for index, _name in enumerate(name2) if _name in name1 and _name in name2]

    è possibile utilizzare list comprehensions

Lascia un commento