Python - 如果所有单词比较都为真,则打印为高

时间:2014-01-27 22:23:04

标签: python

我有两个字符串:

Rob car Mary bike George House Jerry Condo Risk High

Rob car Mary dc George dc Jerry dc

首先,我删除最后两个单词的第一个字符串。我想仅比较字符串1中的carbikehousecondo等字词与cardc等字词。字符串2。因此,我创建了元组(car, car),(bike, dc)(house, dc)(condo dc)

通过比较元组中的单词,我需要将risk打印为highlow。有时在元组中,存在dc。这意味着dc可以接受任何输入,例如bikehousecondo。我不关心那时出现的那个词。

但是,当元组中的两个单词都为risk时,我只想将high打印为car,即car == car。在这里,我不关心存在dc的其他元组,因为它们可以接受任何输入。但是,当元组中的单词不同highcar时,我不想打印house,即car != house。同样,我不关心有dc的元组,因为它可以接受任何输入。

为了解决这个问题,我编写并尝试了这段代码来进行比较,但是失败了,并为所有内容打印high。例如,

当我使用下面的代码时,我得到high这两个字符串:

Rob house Mary bike George House Jerry Condo Risk High

Rob car Mary dc George dc Jerry dc

这是因为第一个元组中的单词是(house,car)和house != car。 我该怎么做才能打印出正确的值?

 def compareLines(devLine, f_hyp):
      global count 
      devSplit = devLine.split()

      risk_val = devSplit[-1]
      risk_attrib = devSplit[-2]
      devSplit = devSplit[:8]

      hypSplit = f_hyp.split()

      if all([(word1 == word2) or (word2 == 'dc') == True] for word1, word2 in zip(devSplit[1::2], hypSplit[1::2])):
           risk_setVal = "high"

           if risk_val != risk_setVal:
                count += 1

           print risk_setVal 

       else:
           risk_setVal =  "low"
           print risk_setVal 

2 个答案:

答案 0 :(得分:1)

我认为问题出在您的if all(...):行。 all(...)内的理解将为您的示例输入生成此内容:

[[False], [True], [True], [True]]

这是因为您将(word1 == word2) or (word2 == 'dc') == True包裹在方括号中,从而创建了一个列表。但是,任何非空列表的评估结果为True,因此all(...) 总是评估为True,因为您在非列表中调用它 - 空列表。

all(...)内的理解中移除方括号,你应该很好。

答案 1 :(得分:0)

我认为您正在寻找的案例是:

pairs = zip(devSplit[1::2], hypSplit[1::2])
if (any(a == "car" and b == "car" for a, b in pairs) and 
    all(a == b or b == "dc" for a, b in pairs)):
    print("High")

第一个(any)检查找到一对房屋,第二个(all)检查没有不匹配的对,除非该对的后半部分是"dc"