Как не включать символьный или строковый ввод в массив (Python) - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь написать простую программу, в которой переменная будет хранить тип ввода пользователем до тех пор, пока не появится слово «готово».После этого программа распечатает максимальное и минимальное значения, хранящиеся в переменной.Тем не менее, я бы хотел, чтобы в переменной не хранились символы или строки, в которые пользователь может случайно ввести текст. Какие способы я могу использовать?Попробуйте, кроме?

a=0
store1=''
store2=''
while store1 !='done':
     store1 = input('Enter a number: ')
     store2=store2+' '+store1
     a =a+1
store3=store2.split()
store4=store3[:a-1]
print('Maximum: %s'%(max(store4)))
print('Minimum: %s'%(min(store4)))

Unwanted result

Я попробовал другой способ, и у меня возникла эта проблема.Кто-нибудь знает, что не так?

def RepresentsInt(s):
    try: 
        int(s)
        return True
    except ValueError:
        return False
a=0
store1=''
store2=''
while store1 !='done':
    store1 = input('Enter a number: ')
    b = RepresentsInt(store1)
    if(b==True): 
        store2=store2+' '+store1
    #        a =a+1
 store3=store2.split()
 #store4=store3[:a-1]
 print(store3)
 print('Maximum: %s'%(max(store3)))
 print('Minimum: %s'%(min(store3)))
 #print(len(store3))

Кажется, сохраненное значение содержит только числа в строковом формате.Однако, когда он печатает значения max и min, он не выводит правильные значения max и min, как показано на рисунке ниже.Another way

1 Ответ

0 голосов
/ 11 июня 2018

Используя вашу текущую реализацию (количество проблем), вот как вы выполняете проверку:

a=0
store1=''
store2=''
while store1 !='done':
  store1 = input('Enter a number: ')
  if store1 == 'done':
    break;
  try:
    int(store1)
  except ValueError:
    continue
  store2=store2+' '+store1
  a =a+1
store3=store2.split()
store4=store3[:a-1]
print('Maximum: %s'%(max(store4)))
print('Minimum: %s'%(min(store4)))

Я добавил в немедленную проверку входного значения (в противном случае он выполняет с 'done''значение, вызывая вывод Maximum: d).

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

Использование выглядит следующим образом:

$ python3 input.py
Enter a number: 1
Enter a number: 2
Enter a number: what
Ivalid input.
Enter a number: 3
Enter a number: 4
Enter a number: done
Maximum: 3
Minimum: 1

Итак, у нас все еще есть проблема с нахождением максимального значения.Возникает вопрос, почему все манипуляции со строками?

Вот более простая реализация, использующая вместо этого массив:

numbers = []
while True:
  input_value = input('Enter a number: ')
  if input_value == 'done':
    break
  try:
    int_value = int(input_value)
  except ValueError:
    print("Ivalid input.")
    continue
  numbers.append(int_value)

print('Maximum: %s'%(max(numbers)))
print('Minimum: %s'%(min(numbers)))

Использование:

$ python3 input.py
Enter a number: 1
Enter a number: 2
Enter a number: what
Ivalid input.
Enter a number: 3
Enter a number: 4
Enter a number: done
Maximum: 4
Minimum: 1

РЕДАКТИРОВАТЬПроблема со второй попыткой заключается в том, что вы выполняете лексикографическую сортировку вместо числовой.Это связано с тем, что в массиве хранятся строковые значения.

# sorting strings, lexicographically
>>> [x for x in sorted(['1000', '80', '10'])]
['10', '1000', '80']

# sorting numbers, numerically
>>> [x for x in sorted([1000, 80, 10])]
[10, 80, 1000]

В моем фиксированном примере, приведенном выше, строки преобразуются в целочисленные значения, прежде чем они сохраняются в массиве, поэтому в итоге они сортируются численно..

...