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

时间:2018-08-02 14:10:53

标签: python python-3.x list search

我正在尝试搜索具有特定值的列表,如果列表中存在这些值中的任何一个,我想执行其他操作。

当前这是我正在使用的列表:

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中的情况下,执行特定操作。

6 个答案:

答案 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 comprehensionenumerate。只要您的清单符合所需顺序,这也将减少所需的体力劳动。

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)]