在python中反转数字列表

时间:2015-12-28 14:01:45

标签: python list

所以我一直试图这样做一段时间,并且经常遇到不同的失败。我需要从用户那里获取数字输入并将其放入列表中并以递减值输出:

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

4 个答案:

答案 0 :(得分: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的文档。

答案 1 :(得分: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 :(得分:2)

这将以数字字符串的形式对您的出价列表进行排序,反向按数字顺序排列:

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

如果你需要垂直打印:

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

答案 3 :(得分: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: ')