我正在尝试搜索具有特定值的列表,如果列表中存在这些值中的任何一个,我想执行其他操作。
当前这是我正在使用的列表:
print(categories)
['Creams', 'Bath', 'Personal Care']
我想做的是在此类别列表中搜索一些不同的值。为此,我将categories
转换为一个集合,并使用if语句分别搜索每个值。
例如:
c = set(categories)
if "Conditioners" in c:
print("1")
if "Bath" in c:
print("2")
if "Shaving Gels" in c:
print("3")
哪个返回:
2
理想情况下,我希望将我的条件放入列表或其他相关数据结构中,并在该值以有效方式存在于categories
中的情况下,执行特定操作。
答案 0 :(得分:6)
您可以将函数存储在需要值的字典中。这样,您可以轻松地通过键访问它们,并且可以正常遍历类别:
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
答案 1 :(得分:2)
IIUC,这就是您想要的。 dict comprehension
与enumerate
。只要您的清单符合所需顺序,这也将减少所需的体力劳动。
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
答案 2 :(得分:1)
可能字典是合适的数据类型。您可以像这样完成您的任务。
diction = {"Conditioners": 1, "Bath": 2} #add whatever else you want
for item in categories:
try:
print(diction[item])
except:
continue
答案 3 :(得分:1)
我想提出另一种简洁而可维护的字典替代方法。您还可以使用@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
的命名至关重要。我基本上使用了一个没有空格的相同值,然后将列表中的实际值strip
用它们在类中进行检索。
基本上,我建议这样做是为了克服将字典与lambda结合使用可能导致代码不可读的问题。确实,您的特定示例要求简单地使用print()
值。但是,如果方法的逻辑更加复杂怎么办?您将足够快地编写不可读的字典。
现在,另一种选择是将逻辑包装在方法中并在字典中使用。
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
那也是有效的。我更喜欢类定义,因为很清楚此类打算做什么,并且我喜欢在一个紧凑的位置放置相关代码。
答案 4 :(得分:0)
categories = ['Creams', 'Bath', 'Personal Care']
criteria = {"Conditioners" : "1", "Bath" : "2", "Shaving Gels" : "3"}
# loop through all the categories
for i in set(categories):
# if the category is in the criteria print the value
if i in criteria.keys():
print(criteria[i]) #print 2
答案 5 :(得分:0)
这样的事情(对于您在上面提到的确切情况)
a=['Creams', 'Bath', 'Personal Care']
b=['Conditioners','Bath','Shaving Gels']
[print(c-1) for c,e in b if e in enumerate(a)]