Python 3.x执行此代码的最佳方法是什么?

时间:2015-12-01 13:42:04

标签: python list python-3.x while-loop sorted

我正在编写一个代码,用户输入尽可能多的数字,直到他们输入Stop。每个输入都会添加到列表中。我希望输入为整数,因此输入可以正确排序,但是当'停止'输入将创建错误消息。但是,如果我输入字符串,则数字将被错误地排序。

以下是代码:

Num_List = list()
Numbers = input('Enter a number: ')
Num_List.append(Numbers)
Num_B = False
while Num_B == False:
    Numbers = input('Enter a number: ')
    Num_List.append(Numbers)
    if Numbers == 'Stop':
        Num_List.remove('Stop')
        Num_List = [i for i in Num_List if i is not '']      
        Num_List.sort(reverse=False)
        sorted(Num_List)
        print(Num_List)
        Num_B = True

3 个答案:

答案 0 :(得分:1)

我怀疑您使用 python< 2.8 ,因此input()表现不同并执行给定的内容而不是将其作为字符串返回(如eval(input()))。给定int时,没有问题,但是当给出“停止”时,python不知道如何处理它(除非你的代码有一个名为“Stop”的变量......)。

以下是对 python2 的代码的简单修改:

# little trick to use input with python2 or python3 !
# source: http://stackoverflow.com/a/7321970/956660
try: input = raw_input
except NameError: pass

# variables naming is prefered in snake_case
num_list = []
curr_num = '' # only use one variable for input
while curr_num.lower() != 'stop': # lower allows to be case insensitive
    # raw_input prevent the "bug"
    curr_num = input('Enter a number or "stop": ')

    # conversion to int raise an error on invalid string, so we ignore errors
    try: num_list.append(int(curr_num))
    except ValueError: pass

# we print and sorted only when everything have been inputted
print('Numbers: %s' % num_list)
print('Sorted: %s' % sorted(num_list))

编辑: 重构代码为python 2& 3兼容。所以你可以在任何地方使用input();)

答案 1 :(得分:0)

这是我的方法:在无限循环中,获取用户的输入。如果' Quit' 则退出循环。否则,转换为整数并附加到数字列表。代码:

numbers = list()
while True:
    token = input('Number: ')
    if token == 'Quit':
        break
    numbers.append(int(token))

print('List is:', numbers)

更新

根据原始海报忽略空字符串判断,我猜一些输入是空字符串,导致ValueError。有了这个猜测,我修改了我的代码,以便记录那些未成功转换为数字的令牌。

numbers = list()
while True:
    token = input('Number: ')
    if token == 'Stop':
        break
    try:
        numbers.append(int(token))
    except ValueError:
        print('Invalid token, ignore: {!r}'.format(token))

print('List is:', numbers)

更新2:

我又修改了我的代码。这次,代码在Python 2和3解释器中运行良好。

from __future__ import print_function

# Level the difference between Python 2 and 3
try:
    raw_input
except NameError:
    raw_input = input

numbers = list()
while True:
    try:
        token = raw_input('Number: ')
        numbers.append(int(token))
    except ValueError:
        if token == 'Stop':
            break
        print('Invalid token, ignore: {!r}'.format(token))

print('List is:', numbers)

更新3

来自Python 3的更新2的输出:

Number: 7
Number: 87
Number: 120
Number: 
Invalid token, ignore: ''
Number: foo
Invalid token, ignore: 'foo'
Number: bar
Invalid token, ignore: 'bar'
Number: Stop
List is: [7, 87, 120]

Python 2运行的输出是相同的。

答案 2 :(得分:0)

你可以这样做:

Num_List = list()
Numbers = input('Enter a number:')
while Numbers != 'Stop':
    Num_List.append(int(Numbers))
    Numbers = input('Enter a number:')

Num_List = [i for i in Num_List if i is not '']      
Num_List.sort(reverse=False)
sorted(Num_List)
print(Num_List)