Python-搜索列表中的多个值并执行多个操作

Python-搜索列表中的多个值并执行多个操作,python,python-3.x,list,search,Python,Python 3.x,List,Search,我正在尝试搜索一个列表中的特定值,如果列表中存在这些值中的任何一个,我希望执行不同的操作 目前,这是我正在处理的列表: print(categories) ['Creams', 'Bath', 'Personal Care'] 我想做的是在这个分类列表中搜索一些不同的值。为此,我将类别转换为一个集合,并使用if语句分别搜索每个值 例如: c = set(categories) if "Conditioners" in c: print("1") if "Bath" in c:

我正在尝试搜索一个列表中的特定值,如果列表中存在这些值中的任何一个,我希望执行不同的操作

目前,这是我正在处理的列表:

print(categories)
['Creams', 'Bath', 'Personal Care']
我想做的是在这个分类列表中搜索一些不同的值。为此,我将
类别
转换为一个集合,并使用if语句分别搜索每个值

例如:

c = set(categories)
if "Conditioners" in c:
     print("1")
if "Bath" in c: 
     print("2")
if "Shaving Gels" in c:
     print("3")
返回:

2

理想情况下,我想做的是将我的标准放入一个列表或其他相关数据结构中,并让它以有效的方式执行特定的操作,如果该值存在于
类别中。

IIUC,这就是您要找的<代码>听写理解
枚举
。这也将减少所需的体力劳动量,只要您的列表符合您想要的顺序

d = {k:v for v,k in enumerate(categories,1)}
d
{'Creams': 1, 'Bath': 2, 'Personal Care': 3}
您可以在字典上执行任何需要的操作

c = ['Conditioners','Bath','Shaving Gels']
for i in c:
    print (d.get(i, None))
None
2
None

您可以将函数存储在字典中,其中的值是所需的函数。这样,您就可以通过键轻松访问它们,并且可以正常遍历类别:

categories = ['Creams', 'Bath', 'Personal Care']

my_dict = {
    'Conditioners': lambda: print(1),
    'Bath': lambda: print(2),
    'Shaving Gels': lambda: print(3)
}


for category in categories:
    fn = my_dict.get(category, lambda: None)
    fn()
输出:

2

字典可能是合适的数据类型。你可以像这样完成你的任务

diction = {"Conditioners": 1, "Bath": 2} #add whatever else you want

for item in categories:
        try:
           print(diction[item])
        except:
            continue
类似这样的内容(针对您上面提到的确切案例)


我想推荐另一种简洁且可维护的词典替代品。您还可以使用
@staticmethod
创建一个类,并使用
getattr
调用如下方法:

categories = ['Creams', 'Bath', 'Personal Care']

class CategoriesWorker:
    @staticmethod
    def Creams():
        print(1)
    @staticmethod
    def Bath():
        print(2)
    @staticmethod
    def PersonalCare():
        print(3)

for category in categories:
    try:
        getattr(CategoriesWorker, category.replace(" ", ""))()
    except AttributeError:
        pass

>>>
1
2
3
请注意,
@staticmethod
s的命名至关重要。我基本上使用了一个不带空格的相同值,然后
将列表中的实际值去除
以在类中检索它


基本上,我建议这样做是为了克服将字典与lambdas结合使用可能导致无法读取代码的问题。实际上,您的特定示例要求只打印值。但如果这些方法的逻辑更复杂呢?你写一本不可读的字典的速度足够快

现在,另一种方法是将逻辑封装在方法中,并在字典中使用它

categories = ['Creams', 'Bath', 'Personal Care','test']
def Creams():
  print(1)

def Bath():
  print(2)

def PersonalCare():
  print(3)

comparison_dict = {'Creams':Creams,'Bath':Bath,'Personal Care':PersonalCare}


for category in categories:
  comparison_dict.get(category, lambda: None)()

>>>>
1
2
2

这也是有效的。我更喜欢这个类的定义,因为它清楚这个类打算做什么,并且我喜欢在一个紧凑的位置上有相关的代码

为什么不把关键字放在字典里,映射到在类别上执行的函数呢?这就是我要找的。非常感谢。如果在
categories
列表中,
my_dict
值中的两个或多个键与每个单独的函数相对,您是否知道我如何可以执行不同的函数?@express\u v2有点复杂,答案很长,需要注释。欢迎提出新问题。
categories = ['Creams', 'Bath', 'Personal Care']

class CategoriesWorker:
    @staticmethod
    def Creams():
        print(1)
    @staticmethod
    def Bath():
        print(2)
    @staticmethod
    def PersonalCare():
        print(3)

for category in categories:
    try:
        getattr(CategoriesWorker, category.replace(" ", ""))()
    except AttributeError:
        pass

>>>
1
2
3
categories = ['Creams', 'Bath', 'Personal Care','test']
def Creams():
  print(1)

def Bath():
  print(2)

def PersonalCare():
  print(3)

comparison_dict = {'Creams':Creams,'Bath':Bath,'Personal Care':PersonalCare}


for category in categories:
  comparison_dict.get(category, lambda: None)()

>>>>
1
2
2