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