在Python Object中查找具有多个OR条件的字符串

时间:2013-12-04 19:40:47

标签: python operators

我正在尝试控制对象中的许多变量。为此,我希望查看对象中是否存在某些单词:

jobs = csv.DictReader(open("jobsFile.csv", "rb"))
jobsWithRoles = []

for i in jobs:
     if "Clerk" or "Stock" or "Sales" in jobs['Roles']:
          i["RoleNum"] = 1
          jobsWithRoles.append(i)
elif "Janitor" or "President" or "Driver" in jobs["Roles"]:
         i["RoleNum"] = 2
         jobsWithRoles.append(i)
else:
         i["RoleNum"] = 5
         jobsWithRoles.append(i)

问题是,无论字符串是否存在,所有内容都会被指定为“1”。

3 个答案:

答案 0 :(得分:1)

现在,您的代码正在评估如下:

if ("Clerk") or ("Stock") or ("Sales" in jobs['Roles']):

此外,由于非空字符串在Python中求值为True,因此if语句将始终传递,因为它正在评估非空字符串。

我认为你打算做的是:

# Notice how I replaced `jobs['Roles']` with `i['Roles']`
if "Clerk" in i['Roles'] or "Stock" in i['Roles'] or "Sales" in i['Roles']:

或者,你可以这样做:

if any(x in i['Roles'] for x in ("Clerk", "Stock", "Sales")):

更干净。

答案 1 :(得分:1)

首先,我认为您的缩进很糟糕,您认为elifelseif对应。

if中的第一个条件是"Clerk",它总是评估为True,就像所有字符串一样。 看看这个:

>>> d = dict()
>>> if "string" or "NOT THERE!" in d:
...     print("Hello world!")
... 
Hello world!

This可能是一种解决方案。

答案 2 :(得分:0)

问题在于,您始终将第一个条件评估为True。

if "Clerk" or "Stock" or "Sales" in jobs['Roles']

所以,你说的是:如果“职员”是真的,或者“股票”是真的等等......

Python评估任何不同于“”的字符串为真。

我建议您使用以下功能:

def search_in_jobs(words, jobs):
    for w in words:
        if w in jobs: return True
    return False

然后重写条件:

if search_in_jobs(["Clerk", "Stock", "Sales"], jobs)