Python: проверка значений трех переменных одновременно

1

У меня есть три случайно сгенерированных поплавка, a, b и c:

a = np.random.uniform(-99.999, 99.999)
b = np.random.uniform(-99.999, 99.999)
c = np.random.uniform(-99.999, 99.999)

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

         1         2         3         4         5         
123456789012345678901234567890123456789012345678901234567
#########################################################RULER

SOMETHING ELSE  ~   ~   ~   ~    -XX.XXX -XX.XXX -XX.XXX

Теперь мне нужно проверить:

  • Во-первых, если каждая переменная является положительной или отрицательной, поскольку знак всегда находится в позиции 34 (a), 42 (b) и 50 (c), если соответствующее значение отрицательно.
  • Во-вторых, если число перед запятой/точкой имеет две цифры или одну цифру. Во втором случае нам понадобится другое пространство.

Таким образом, каждое значение переменных a, b и c может быть (положительным или отрицательным) и (выше 10 или ниже 10), и цель состоит в том, чтобы записать число всегда в то же самое местоположение (скорректированное пробелами).

Пока проблема.

Мои знания python по-прежнему довольно простые. Что бы я сделал, вероятно, было бы задействовано более 50 строк кода, в том числе...

if x >= 0 and x // 10 != 0: #check if x is larger than 0 and has two digits
   if y >= 0 and y // 10 != 0: #check if y is larger than 0 and has two digits 
      ...

но должно быть более элегантное решение, возможно, даже один лайнер.

Теги:
string
string-conversion

2 ответа

2
Лучший ответ

Я интерпретирую этот вопрос как "Я хочу преобразовать каждое из своих поплавков в строку, добавляя, однако, много пробелов, чтобы сделать их ровно семь пробелов".

На самом деле вам не нужны какие-либо условные обозначения. Метод str.format может применять дополнение к вашему значению без необходимости подсчета десятичных знаков или чего-либо еще.

>>> a = 1.0
>>> b = -23.42
>>> c = 5.678
>>> result = "{: 7} {: 7} {: 7}".format(a,b,c)
>>> print(result)
    1.0  -23.42   5.678

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

>>> "{:7.3f} {:7.3f} {:7.3f}".format(a,b,c)
'  1.000 -23.420   5.678'

Если вы думаете "хорошо, но я также хочу, чтобы прокладка появлялась после знака, но перед цифрами", вы можете сделать следующее:

>>> a = -1.0
>>> "{:=7.03f} {:=7.03f} {:=7.03f}".format(a,b,c)
'- 1.000 -23.420   5.678'

Если вы думаете "хорошо, но может ли заполнение быть нулями вместо пробелов? Итак, каждое число имеет ровно две цифры перед десятичной точкой", то вы можете сделать:

>>> "{:0= 7.03f} {:0= 7.03f} {:0= 7.03f}".format(a,b,c)
'-01.000 -23.420  05.678'
0

Это один из способов объединить ваши три утверждения if. Вы можете расширить эту идею для своей задачи

x, y, z = 12, 24, 16

if all(item > 0 and item // 10 != 0 for item in [x,y,z]):
    print ("Condition matched")
else:
    print ("Condition not matched")

# x, y, z = 12, 24, 16
# Condition matched

# x, y, z = 12, 24, 6
# Condition not matched
  • 0
    Хорошо, но теперь вам нужно сделать еще одно утверждение для всех отрицательных чисел x, y, z, а также для всех комбинаций.
  • 1
    Это удовлетворительное решение, если ОП нужен только ответ «да» или «нет», чтобы «все три моих значения соответствовали критериям, которые я установил?». Но у меня складывается впечатление, что они на самом деле ищут более подробную информацию, то есть «какие из моих ценностей соответствуют критериям, и, в частности, каким частям критериев они соответствуют, а какие - нет?»
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню