2015-12-28 7 views
7

Так что я пытаюсь это сделать какое-то время и постоянно сталкиваюсь с различными неудачами. Мне нужно взять числовую входные данные от пользователя и поместить его в список и выводит его в уменьшении значения:Реверсивные списки чисел в 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) 

Так это работало хорошо большую часть времени, (я использую число 2,3,4 & 10 в качестве входных данных, как я возникают проблемы, где он показывает числа в порядке убывания для первой цифры), но когда я типа в 16, 30, 24 он отображает номера, как:

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

Вот другая версия Я попытался:

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) 

Любая помощь будет высоко оценена, поскольку я довольно новичок в python и борюсь с моим курсом.

-Callum

+0

Это Python 2 или Python 3? 'input' делает разные вещи в каждом. – ShadowRanger

+0

Я считаю, python 3 –

+0

@CPastuszak Запустить 'python --version' – Daenyth

ответ

8

В вашем

bids.append(bid) 

вы получите список строк. Вы хотите, чтобы преобразовать их в целые числа и рода в порядке убывания:

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

и теперь numerical_bids список целых чисел, отсортированных в порядке убывания.

В коде:

for bid in bids: 
    bid = int(bid) 

ничего не делает. Он преобразует каждый bid в целое число и немедленно забывает об этом.

И

bids.sort([::-1]) 

не то, как использовать метод sort. Прочтите документы для list.sort.

+0

Большое вам спасибо, но как бы я получил его, чтобы распечатать отсортированный список в вертикальном формате, таком как выше, а не в формате списка –

+0

@CPastuszak, как вы печатаете список, если он прекрасен, с циклом for ... – Copperfield

+0

@Copperfield Но я не понимаю, куда вставлять цикл for –

2

Это отсортирует для вас список предложений в виде числовых строк, в обратном, в цифровом порядке:

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

И если вам нужно распечатать его по вертикали:

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

Это будет сортировать ставки, но оставить их как строки, которые, вероятно, не предназначены. –

+0

Ну, я попытался ответить на вопрос и помочь человеку, который попросил его лучше понять Python. Я не думаю, что люди, отвечающие на вопросы, должны размышлять о намерениях, если они не выражены явно каким-то образом. – Lukasz

3

Ваша проблема принципиально в этом цикле:

for bid in bids: 
    bid = int(bid) 

выше не изменяет содержимое bids. Он создает новые целые экземпляры с именем bid каждый раз, с которыми вы ничего не делаете. Поэтому, когда вы позже перейдете к сортировке bids, вы просто сортируете исходные элементы строки, а не целые числа.

Если вы хотите отсортировать целочисленные значения, у вас есть несколько вариантов.Одним из них является для преобразования значений целых чисел, как они приходят в:

bids.append(int(bid)) 

Один заключается в преобразовании и сортировку прямо в цикле печати:

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

Поскольку подход вы, казалось, хотели принять это заменить струнные элементы bids с целыми элементами вместо этого, вы, вероятно, хотите сделать что-то вроде исходного цикла, но не выбрасывайте результаты:

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

Много людей W плохо вам сказать, что выше более кратко написано как

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

Я использовал intbids как отдельный список, чтобы понять, что происходит. Если вы хотите просто выбросить список строк ставку один раз у вас есть список число ставок, вы можете просто использовать то же имя:

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

Если это действительно, очень важно, чтобы сделать замену каждого элемента «на месте "(а значит, не создать новый список), то самый простой для понимания способ, вероятно, в цикле по индексам:

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

(Но пока не очень опытный и работает с тоннами и тоннами данных , моя сильная рекомендация - не беспокоиться о «обновлении списков на месте». Это не так естественно, как писать Python.)

1

Хорошо, позвольте мне объяснить: Вы не сортируете свои входы!

В вашем втором случае ваш список [16,30,24], и вы печатаете его в обратном порядке 24, 30, 16, что верно.

Я вижу две проблемы:
- вы не сортирует значения для печати
- вы не проверить, если новая ставка выше, чем предыдущий (какой вид торгов является то, что?)

для первой части, asuming список уже содержит int, вы просто должны сортировать его:

bids.sort() 

Или, если вы хотите, вы его в обратном порядке:

bids.sort(reverse=True) 

Для второй части, просто проверить, если новый вход больше, прежде чем добавить его в список:

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: ') 
Смежные вопросы