2015-12-28 20 views
7

Così ho cercato di fare questo per un po 'di tempo e sono costantemente in arrivo con diversi fallimenti. Ho bisogno di prendere l'input numerico dall'utente e metterlo in un elenco ed emetterlo discendente valore:Inversione di elenchi di numeri in python

bids = [] 
bid = input('Bid: ') 
while bid != '': 
    bids.append(bid) 
    bid = input('Bid: ') 
print('The auction has finished! The bids were:') 

for bid in bids: 
    bid = int(bid) 

for bid in reversed(bids): 
print(bid) 

Quindi questo funzionava bene la maggior parte del tempo, (ho utilizzato i numeri 2,3,4 & 10 come input come avendo problemi dove mostra i numeri in ordine decrescente per la prima cifra), ma quando digito 16, 30, 24 visualizza i numeri come:

The auction has finished! The bids were: 
24 
30 
16 

Ecco un'altra versione Ho provato:

bids = [] 
bid = input('Bid: ') 
while bid != '': 
    bids.append(bid) 
    bid = input('Bid: ') 
print('The auction has finished! The bids were:') 

for bid in bids: 
    bid = int(bid) 

bids.sort([::-1]) #Here is where the problem is at, I don't know 
        #what the correct syntax is for something like that 

for bid in bids: 
    print(bid) 

Qualsiasi aiuto sarà molto apprezzato in quanto sono abbastanza nuovo per Python e sto lottando con il mio corso.

-Callum

+0

È questo il Python 2 o Python 3? 'input' fa cose molto diverse in ciascuna. – ShadowRanger

+0

Credo python 3 –

+0

@CPastuszak Esegui 'python --version' – Daenyth

risposta

8

Nella tua

bids.append(bid) 

si ottiene una lista di stringhe. Si vuole convertirli in interi e sorta in ordine decrescente:

numerical_bids = [int(bid) for bid in bids] 
numerical_bids.sort(reverse=True) 

e ora numerical_bids è un elenco di numeri interi ordinati in ordine decrescente.

Nel codice:

for bid in bids: 
    bid = int(bid) 

non fa nulla. Converte ogni bid in un numero intero e lo dimentica immediatamente.

E

bids.sort([::-1]) 

non è come utilizzare il metodo sort. Leggi i documenti per list.sort.

+0

Grazie mille, ma come potrei farlo stampare l'elenco ordinato in un formato verticale come quelli sopra e non nel formato elenco –

+0

@CPastuszak il modo in cui si stampa l'elenco se l'opzione è corretta, con il ciclo for ... – Copperfield

+0

@Copperfield Ma non capisco dove inserire il ciclo for –

2

Ciò ordinerà per voi la lista delle offerte sotto forma di stringhe numeriche, in rovesciata, ordine numerico:

bids.sort(key=int, reverse=True) 

E se avete bisogno di stampare in verticale:

print('\n'.join(bids)) 
+0

Questo ordinerà le offerte, ma le lascerà come stringhe, che probabilmente non è intesa. –

+0

Bene, ho cercato di rispondere alla domanda e aiutare la persona che l'ha chiesto a capire meglio Python. Non penso che le persone che rispondono alle domande debbano speculare sulle intensità se non fossero esplicitamente espresse in qualche modo. – Lukasz

3

il vostro problema è fondamentalmente in questo ciclo:

for bid in bids: 
    bid = int(bid) 
che questo

non altera il contenuto di bids. Crea nuove istanze di integer, denominate bid ogni volta, con le quali non si fa nulla. Quindi, quando in seguito andrai a ordinare bids, stai solo ordinando gli elementi stringa originali, non i numeri interi desiderati.

Se si desidera ordinare i valori interi, sono disponibili alcune scelte.Uno è quello di convertire i valori in interi come vengono in:

bids.append(int(bid)) 

Uno è quello di convertire e ordinare direttamente nel tuo ciclo di stampa:

for bid in sorted((int(x) for x in bids), reverse=True): 
    print(bid) 

Dal momento che l'approccio che sembrava voler prendere è quello di sostituire gli elementi di stringa di bids con elementi interi, invece, probabilmente avrete bisogno di fare qualcosa di simile il ciclo originale, ma non buttare via i risultati:

intbids = [] 
for bid in bids: 
    intbids.append(int(bid)) 

Un sacco di gente w ill dire che quanto sopra è più conciso scritto come

intbids = [int(bid) for bid in bids] 

ho usato intbids come una lista separata per far capire che cosa sta accadendo. Se si vuole buttare solo via l'elenco delle offerte di stringa una volta che hai la lista delle offerte intero, si può semplicemente utilizzare lo stesso nome:

bids = [int(bid) for bid in bids] 

Se è davvero, davvero importante per fare la sostituzione di ogni elemento "in atto "(significato non si crea un nuovo elenco), quindi il più semplice da comprendere modo è probabilmente quello di un ciclo su indici:

for i in range(len(bids): 
    bids[i] = int(bids[i]) 

(Ma finché non si è molto esperti e lavorare con tonnellate e tonnellate di dati , la mia forte raccomandazione è di non preoccuparsi dell'aggiornamento "in-place" delle liste, non è un modo naturale di scrivere Python.

1

Ok, mi spiego: Non stai smistando i tuoi input!

Nel secondo caso, l'elenco è [16,30,24] e lo stai stampando nell'ordine inverso 24, 30, 16 che è corretto.

vedo due problemi:
- non sei l'ordinamento dei valori per la stampa
- non sta controllando se la nuova offerta è superiore a quello precedente (che tipo di offerta è quello?)

per la prima parte, asuming la lista contiene già int, devi solo di risolvere:

bids.sort() 

O se lo vuoi in ordine inverso:

bids.sort(reverse=True) 

Per la seconda parte, basta controllare se il nuovo input è più grande prima di aggiungerlo alla lista:

while bid != '': 
    if bids and bid < bids[-1]: 
     print "Error: your bid must be higher than last bid. Last bid: {}".format(bids[-1]) 
    else: 
     bids.append(bid) 
    bid = input('Bid: ')