我有两个字符串:
Rob car Mary bike George House Jerry Condo Risk High
Rob car Mary dc George dc Jerry dc
首先,我删除最后两个单词的第一个字符串。我想仅比较字符串1中的car
,bike
,house
,condo
等字词与car
,dc
等字词。字符串2。因此,我创建了元组(car, car)
,(bike, dc)
,(house, dc)
和(condo dc)
。
通过比较元组中的单词,我需要将risk
打印为high
或low
。有时在元组中,存在dc
。这意味着dc
可以接受任何输入,例如bike
,house
,condo
。我不关心那时出现的那个词。
但是,当元组中的两个单词都为risk
时,我只想将high
打印为car
,即car == car
。在这里,我不关心存在dc
的其他元组,因为它们可以接受任何输入。但是,当元组中的单词不同high
和car
时,我不想打印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
答案 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"
。