如果条件表达不起作用

时间:2014-12-17 17:59:38

标签: python if-statement

我有两个包含以下值的列表

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代码的循环,其中if条件没有 idk为60时工作,时间= 60/60 = 1k

在这种情况下,当list1k为'0'且列表2为'3'时,它应该进入if条件。但是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"

3 个答案:

答案 0 :(得分: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 / 6061 / 6062 / 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

答案 1 :(得分:0)

尝试:

python2
>>> int < str
True

这是因为您要比较整数和字符串,请参阅Built-in Types

  

除数字外的不同类型的对象按其类型排序   名称;不支持正确比较的相同类型的对象   按地址排序   这在Python3中被“修复”:

这在Python3中已“修复”:

python3
>>> int < str
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: type() < type()

答案 2 :(得分:0)

问题是因为您正在比较浮点值和字符串值。 time转换为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循环之后的if语句中看到缩进错误。代码应该是:

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")

它应该适用于这些变化。

考虑以下对代码的修改,但不是必需的。

使用上面的代码,时间将是Python 3.3中的数据类型float(不知道更低版本)。 使用以下语句将其显式转换为整数类型:

time=int(id/60)