Python AND OR语句

时间:2015-06-17 06:40:41

标签: python if-statement conditional

我正在使用Python解析文本,我有最后的代码来编写句子,但它不能很好地工作:

        opt = child.get('desc')
        extent = child.get('extent')
        if opt == 'es':
            opt = "ESP:"
        elif opt == "la":
            opt = "LAT:"
        elif opt == "en":
            opt = "ENG:"
if opt in ["es","la","en","ar","fr"] and extent == "begin":
    print time, opt+(" " + opt).join([c.encode('latin-1') for c in child.tail.split(' ')])

它只适用于OR语句,但是当我添加AND语句(我真的需要)时,没有任何变化。有人请吗?

5 个答案:

答案 0 :(得分:3)

除非第一行代码的输出为"ar""fr"(或其他不属于if-elif条件的内容),否则您覆盖了opt变量。考虑将“新”opt重新命名为其他内容,如下所示:

opt = child.get('desc')

extent = child.get('extent')

if opt == 'es':
    opt2 = "ESP:"
elif opt == "la":
    opt2 = "LAT:"
elif opt == "en":
    opt2 = "ENG:"

# Check variable values
print "opt: ", opt
print "opt2: ", opt2

if opt in ["es","la","en","ar","fr"] and extent == "begin":
    print time, opt2+(" " + opt2).join([c.encode('latin-1') for c in child.tail.split(' ')])

我不确定您希望从代码中实现什么,但如果原始if-else条件返回列表中存在的字符串,则上述内容至少会满足child.get('desc')条件。

答案 1 :(得分:2)

您的if声明的第一个条件中的选择列表就是问题所在。

例如,opt恰好是es,那么

if opt == 'es':
    opt = "ESP:"

会将其更改为ESP:

if opt in ["es","la","en","ar","fr"] and extent == "begin":

然后永远不会True(当您使用and代替or时)。

如果您将该行更改为

if opt in ["ESP:","LAT:","ENG:","ar","fr"] and extent == "begin":

它可能会起作用(如果您显示的代码与问题相关的那些代码)。

答案 2 :(得分:1)

要通过 AND运算符成为条件True,所有条件需要 True

要通过 OR运算符成为条件True,必须 True 来自任何一个条件

<强> E.g。

In [1]: True and True
Out[1]: True

In [2]: True and False
Out[2]: False

In [3]: True or False
Out[3]: True

在您的代码中,打印以下语句:

print "Debug 1: opt value", opt
print "Debug 2: extent value", extent

为什么要再次使用相同的变量名?

如果opt的值为es,则条件if opt == 'es':Trueopt变量再次分配给值ESP:。 在最后的if语句中,您检查opt in ["es","la","en","ar","fr"],因此始终为False

    opt = child.get('desc')
#   ^^
    extent = child.get('extent')
    if opt == 'es':
        opt = "ESP:"
    #   ^^
    elif opt == "la":
        opt = "LAT:"
    elif opt == "en":

答案 3 :(得分:1)

opt是其中之一时:"es", "la", "en"
那么opt的值就会改变,这就是:
if opt in ["es","la","en","ar","fr"] and extent == "begin":
没有通过,因为opt是错误的。

我猜extent等于"begin",所以如果你将andor交换,它会通过,因为其中一个陈述是正确的。尝试删除此大if/elif/elif并尝试使用and再次运行它。它应该通过。

答案 4 :(得分:0)

这是运营商优先级问题。您希望代码可以用作:

if (opt in ["es","la","en","ar","fr"]) and (extent == "begin"):
    print time, opt+(" " + opt).join([c.encode('latin-1') for c in child.tail.split(' ')])

但它可以作为

if opt in (["es","la","en","ar","fr"] and extent == "begin"):
    print time, opt+(" " + opt).join([c.encode('latin-1') for c in child.tail.split(' ')])

评估的值与您预期的值不同。

尝试第一个代码段中的括号。