在Python中反转数字列表

7

我一直在尝试做这件事情,但是不断遭遇失败。我需要从用户那里获取数字输入并将其放入列表中,并以递减的方式输出:

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

这是Python 2还是Python 3?在每个版本中,input的功能都非常不同。 - ShadowRanger
@CPastuszak 运行 python --version - Daenyth
@Daenyth 这是Python 3。 - C Pastuszak
4个回答

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文档。


非常感谢,但是我该如何让它以垂直格式打印已排序的列表,而不是列表格式? - C Pastuszak
@Copperfield 但我不明白在哪里插入for循环。 - C Pastuszak
如果竞标列表不是很庞大,你可以这样做:print('\n'.join(bids)) - Lukasz
@CPastuszak,你想要打印已排序的列表,对吧?那么首先按照 @eumiro 给你展示的方式进行操作,然后像你在代码的最后一行所展示的那样操作,即 for bid numerical_bids: print(bid) - Copperfield
@Copperfield 谢谢,是的,我按照你说的做了,现在它能正常工作了,感谢。 - C Pastuszak

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))

许多人会告诉你,上述内容更简明地写为

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的自然方式。


2
这将为您按照数字字符串的形式对竞标清单进行排序,以相反的数字顺序进行排序:
bids.sort(key=int, reverse=True)

如果您需要垂直打印:

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

这将对出价进行排序,但会将它们保留为字符串,这可能不是预期的结果。 - Björn Marschollek
我已经尝试回答这个问题并帮助询问者更好地理解Python。我不认为回答问题的人应该猜测意图,如果它们没有以某种方式明确表达。 - Lukasz

1

好的,让我解释一下:

你没有对输入进行排序!

在第二种情况下,你的列表是[16,30,24],你按相反的顺序打印它24, 30, 16,这是正确的。

我看到两个问题:
- 你没有对值进行排序以便打印
- 你没有检查新出价是否高于先前的出价(这是什么样的竞价方式?)

对于第一个部分,假设列表已经包含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: ')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接