使用条件语句在Python列表中搜索元素

使用条件语句在Python列表中搜索元素,python,python-3.x,Python,Python 3.x,我试图制作一个程序,其中main\u col是列名,main\u row具有每列的行信息(在二维列表中) 如何为搜索查询编写一段代码,该查询可以在以下位置搜索行: 姓名=卡罗尔,年龄=19岁 姓名='Carol'和性别='F' 年龄=22或性别=M 以下代码给出了第三部分的结果:- main_col = ['Name', 'Age', 'Gender'] main_row = [['Peter', 18, 'M'], ['Sam', 20, 'M'], ['Carol', 19, 'F'], [

我试图制作一个程序,其中
main\u col
是列名,
main\u row
具有每列的行信息(在二维列表中)

如何为搜索查询编写一段代码,该查询可以在以下位置搜索行:

  • 姓名=卡罗尔,年龄=19岁
  • 姓名='Carol'和性别='F'
  • 年龄=22或性别=M
  • 以下代码给出了第三部分的结果:-

    main_col = ['Name', 'Age', 'Gender']
    main_row = [['Peter', 18, 'M'], ['Sam', 20, 'M'], ['Carol', 19, 'F'], ['Malcom', 21, 'M'], ['Oliver', 25, 'M'], ['Mellisa', 21, 'F'], ['Minreva', 18, 'F'], ['Bruce', 23, 'M'], ['Clarke', 24, 'M'], ['Zuck', 22, 'M'], ['Slade', 23, 'M'], ['Wade', 21, 'M'], ['Felicity', 22, 'F'], ['Selena', 23, 'F'], ['Ra\'s Al Gul',700, 'M']]
    

    如果您想坚持您的模式,这是一个选项:

    search = {'Age' : 22, 'Gender' : 'M'}
    
    for i in search:
        idx = main_col.index(i)
        for j in main_row:
            if(j[idx] == search[i]):
                print(j)
    
    def lookup(search, main_row, main_col):
      idxs = [ (main_col.index(key), val) for key, val in search.items()]
      tmp = [ set(tuple(person) for person in main_row if person[i] == v) for  i, v in idxs ]
      return set.intersection(*tmp)
    
    lookup({'Age' : 21}, main_row, main_col)
    #=> {('Wade', 21, 'M'), ('Mellisa', 21, 'F'), ('Malcom', 21, 'M')}
    lookup({'Age' : 21, 'Gender' : 'M'}, main_row, main_col)
    #=> {('Malcom', 21, 'M'), ('Wade', 21, 'M')}
    lookup({'Age' : 21, 'Gender' : 'M', 'Name': 'Malcom'}, main_row, main_col)
    #=> {('Malcom', 21, 'M')}
    
    注意:我使用
    交叉点
    返回
    ,但您可以自定义
    集合
    ():
    联合
    交叉点
    差异


    您可以转换为方便的方法:

    search = {'Age' : 21, 'Gender' : 'M'}
    
    idxs = [ (main_col.index(key), val) for key, val in search.items()]
    tmp = [ set(tuple(person) for person in main_row if person[i] == v) for  i, v in idxs ]
    res = set.intersection(*tmp)
    #=> {('Wade', 21, 'M'), ('Malcom', 21, 'M')}
    

    无论如何,我建议使用主行的dict:

    search = {'Age' : 22, 'Gender' : 'M'}
    
    for i in search:
        idx = main_col.index(i)
        for j in main_row:
            if(j[idx] == search[i]):
                print(j)
    
    def lookup(search, main_row, main_col):
      idxs = [ (main_col.index(key), val) for key, val in search.items()]
      tmp = [ set(tuple(person) for person in main_row if person[i] == v) for  i, v in idxs ]
      return set.intersection(*tmp)
    
    lookup({'Age' : 21}, main_row, main_col)
    #=> {('Wade', 21, 'M'), ('Mellisa', 21, 'F'), ('Malcom', 21, 'M')}
    lookup({'Age' : 21, 'Gender' : 'M'}, main_row, main_col)
    #=> {('Malcom', 21, 'M'), ('Wade', 21, 'M')}
    lookup({'Age' : 21, 'Gender' : 'M', 'Name': 'Malcom'}, main_row, main_col)
    #=> {('Malcom', 21, 'M')}
    
    这将构建字典
    人员
    ,保留第一个标题列表:

    main_row = [['Peter', 18, 'M'], ['Sam', 20, 'M'], ['Carol', 19, 'F'], ['Malcom', 21, 'M'], ['Oliver', 25, 'M'], ['Mellisa', 21, 'F'], ['Minreva', 18, 'F'], ['Bruce', 23, 'M'], ['Clarke', 24, 'M'], ['Zuck', 22, 'M'], ['Slade', 23, 'M'], ['Wade', 21, 'M'], ['Felicity', 22, 'F'], ['Selena', 23, 'F'], ['Ra\'s Al Gul',700, 'M'], ['Oliver', 31, 'M']]
    
    然后,您可以通过以下方式进行查询:

    people = [ {'name':name, 'age':age, 'gender':gender} for name, age, gender in main_row]
    #=> [{'name': 'Peter', 'age': 18, 'gender': 'M'}, {'name': 'Sam', 'age': 20, 'gender': 'M'}, ....
    
    您可以对返回的“记录”执行任何需要的操作:


    您可以尝试一下,这有点复杂,但应该完成这项工作:

    for person in the_21_years_old:
      print(person['name'], person['age'])
    
    # Malcom 21
    # Mellisa 21
    # Wade 21
    
    AND='AND'
    或=‘或’
    #检查数组是否匹配
    找到def(值、聚合器、搜索项):
    如果聚合器==和:
    找到了吗
    对于col,搜索条件中的val.items():
    如果值[val['idx']]!=val['val']:
    is_found=False
    打破
    其他:
    is_found=False
    对于col,搜索条件中的val.items():
    如果值[val['idx']]==val['val']:
    找到了吗
    打破
    已找到退货
    #执行搜索
    def搜索(列、值、聚合器、搜索过滤器):
    #将搜索值格式化为我们可以使用的格式
    # {
    #'col':{'idx':,'val':}
    # } 
    搜索项={
    col:{'idx':columns.index(col),'val':val}
    对于col,搜索过滤器中的val_filters.items()
    }
    返回[
    瓦尔
    对于值中的val
    如果找到(val、聚合器、搜索项)
    ]
    如果名称=“\uuuuu main\uuuuuuuu”:
    主列=[‘姓名’、‘年龄’、‘性别’]
    主排=['Peter',18',M'],['Sam',20',M'],['Carol',19',F'],['Malcom',21',M'],['Oliver',25',M'],['Mellisa',21',F'],['Minreva',18',F'],['Bruce 23',M'],['Clarke',24',M'],['Zuck',22',M'],['Slade 23',M'],['Slade 23',M'],'Wade',21',M'],['M'],['Felicity',22',F'],['F'],[Felicity',F'],[F'],[Felicity',F']
    搜索过滤器={
    “年龄”:22,“性别”:“M”
    }
    打印(搜索(主列、主行或搜索过滤器))
    搜索过滤器={
    “姓名”:“卡罗尔”,“年龄”:19岁
    }
    打印(搜索(主列、主行和搜索过滤器))
    
    我的代码实际上只提供了第三部分的输出,找不到为第一部分和第二部分编码的方法什么代码?这些东西看起来都很相似;你是如何尝试第1部分和第2部分的,具体问题是什么?嘿,你能解释一下为什么你没有初始化is_find=True在这两种情况下,为什么一个初始化为True而另一个初始化为false,因为它是如何处理和或的吗。对于and,我们只需要在所有搜索词匹配时将其设置为true,如果不匹配,则将其标记为false,然后跳出循环。当我们对or执行相反的操作时,我们首先需要将其设置为false,然后在任何匹配中将其标记为true。