使用条件语句在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
具有每列的行信息(在二维列表中)
如何为搜索查询编写一段代码,该查询可以在以下位置搜索行:
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。