2014-12-17 2 views
2

У меня есть два списка со следующими значениямиЕсли выражение условия не работает

List1=['6', '9', '16', '19', '0', '3', '6', '0', '6', '12', '18'] 

List2=['9', '16', '19', '24', '3', '6', '19', '6', '12', '18', '24'] 

Ниже петли из моего кода Python, где, если условие не работу, когда ИДК 60, время = 60/60 = 1k

В этом случае он должен войти в условие if, если list1k имеет «0», а в списке 2 «3». Однако состояние if не работает. Я также попытался использовать следующее выражение:

if ((time >=List1[i]) and (time <=List2[i])): 

Это код:

for id in range(60,63): 
    time = id/ 60 
    for i in range(0, len(List1) - 1): 
    if (((time >List1[i])or(time==List1[i])) and ((time <List2[i])or(time==List2[i]))): 
     print "inside IF" 
+0

@ shuttle87: ОП говорится, что они пытались это тоже. –

+0

Также может стоить делать 'для L1, L2 в zip (List1, List2):' – user2097159

+0

'id/60' возвращает' 1' для всех значений вашего диапазона. – njzk2

ответ

0

Проблема в том, что вы сравниваете с плавающей точкой значения и строковые значения. время преобразуется в float, а List1 и List2 имеют строковые значения.Чтобы преодолеть эту ошибку, объявить List1 и List2 быть целыми числами:

List1=[6, 9, 16, 19, 0, 3, 6, 0, 6, 12, 18]          
List2=[9, 16, 19, 24, 3, 6, 19, 6, 12, 18, 24] 

Кроме того, я вижу ошибку отступа в вашем заявлении, если после второго цикла. Код должен быть:

for id in range(60,63): 
    time = id/ 60 
    for i in range(0, len(List1) - 1): 
     if ((time >=List1[i]) and (time <=List2[i])): 
      print("inside IF") 

Он должен работать с этими изменениями.

Рассмотрите приведенные ниже изменения кода, но это необязательно.

С вышеуказанным кодом время будет иметь тип данных float в Python 3.3 (не знаю о более низких версиях). Явный преобразовать его в целом число типа, используя приведенные ниже Постулаты:

time=int(id/60) 
+0

OP не ** ** сравнение значений поплавка , вместо этого подразделение будет генерировать целые числа. Это Python * 2 *, а не 3 (см. Инструкцию 'print'), и если бы это был Python 3, код бы породил исключение (' TypeError: unorderable types: float()> str() ') –

+0

Да вы являются правильными. Я сказал это в своем ответе, что я использую Python 3.3 и Python 2. – Shivakumar

+0

Различие важно и абсолютно важно для проблемы (например, вы не отвечаете, почему OP видел проблему в первую очередь, не правильно). OP попытался отметить * все * ответы как полезные, ваши последние, так что теперь у нас есть ситуация, когда кажется, что ваш был самым полезным. Но в лучшем случае это также * неполно. –

8

Вы сравниваете строки и целые числа. Числа всегда сортируются перед строками, поэтому time всегда будет ниже, чем List1[i] и List2[i].

Используйте целые в списках вместо:

List1 = [6, 9, 16, 19, 0, 3, 6, 0, 6, 12, 18] 
List2 = [9, 16, 19, 24, 3, 6, 19, 6, 12, 18, 24] 

Python 2 пытается сделать все упорядочиваемое, поэтому он является законным для сравнения строк и целых чисел, но это также означает, что вы можете делать ошибки, как эти , Python 3 удалил эту цель, и попытка сравнить строки с целыми числами, как это, приводит к ошибке.

Обратите внимание, что вы также используете целочисленное деление, потому что оба операнда для оператора деления / являются целыми числами. Вместо этого вы можете использовать деление с плавающей запятой:

time = id/60.0 

Хотя я не совсем уверен, какой результат вы ожидали от подразделения. При целочисленном делении результат 60/60, 61/60 и 62/60 всегда будет 1.

Ваше выражение if может быть упрощена сравнения цепочки:

if List1[i] <= time <= List2[i]: 

Вы можете использовать функцию zip() на пары значений из двух списков:

for id in range(60, 63): 
    time = id/60.0 
    for lower, higher in zip(List1, List2): 
     if lower <= time <= higher: 
      print 'inside if with lower={}, higher={}, time={}'.format(lower, higher, time) 

Это выходы:

>>> List1 = [6, 9, 16, 19, 0, 3, 6, 0, 6, 12, 18] 
>>> List2 = [9, 16, 19, 24, 3, 6, 19, 6, 12, 18, 24] 
>>> for id in range(60, 63): 
...  time = id/60.0 
...  for lower, higher in zip(List1, List2): 
...   if lower <= time <= higher: 
...    print 'inside if with lower={}, higher={}, time={}'.format(lower, higher, time) 
... 
inside if with lower=0, higher=3, time=1.0 
inside if with lower=0, higher=6, time=1.0 
inside if with lower=0, higher=3, time=1.01666666667 
inside if with lower=0, higher=6, time=1.01666666667 
inside if with lower=0, higher=3, time=1.03333333333 
inside if with lower=0, higher=6, time=1.03333333333 
+2

Ошибка проектирования, исправленная с помощью Python 3 – 6502

0

Попытка:

python2 
>>> int < str 
True 

Это потому, что вы сравниваете целые числа и строки, см Built-in Types:

Objects of different types except numbers are ordered by their type names; objects of the same types that don’t support proper comparison are ordered by their address This was "fixed" in Python3:

Это был "фиксированной" в Python3:

python3 
>>> int < str 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unorderable types: type() < type() 
Смежные вопросы