我有一个很长的命令字典,看起来像这样:
OrderedDict([('JIRAUSER16100', {'name': 'john.smith', 'fullname': 'John Smith', 'email': 'John.Smith@domain.test', 'active': True}), ('JIRAUSER16300', {'name': 'susan.jones', 'fullname': 'Susan Jones', 'email': 'Susan.Jones@domain.test', 'active': True})])
如何在此列表中搜索以根据键值匹配找到键值?例如,对于苏珊·琼斯,我想根据姓名值找到她的电子邮件?有没有一种Python方式可以找到它而不只是遍历整个字典?
当前,我仅在下面执行此操作,但是当我必须遍历该列表1000次时,它似乎效率很低。我很好奇是否有某种“查找”方法吗?
searchname = "susan.jones"
for user in my_ordered_dict.items():
if user[1]["name"] == searchname:
print(user[1]["email"])
答案 0 :(得分:1)
您可以通过两种方式对此进行改进。您说 callableStatement = connection.prepareCall("{call ABC(?,?,?,?)}");
callableStatement.setString(1, "test");
callableStatement.setString(2, "12345679090978");
callableStatement.registerOutParameter(3, Types.ARRAY, AConstants.UserDefineObjectA);
callableStatement.registerOutParameter(4, Types.STRUCT, AConstants.UserDefineObjectB);
callableStatement.execute();
return (Object[]) ((java.sql.Array) callableStatement.getObject(3)).getArray();
确实很长,所以我建议您使用第一种方法,因为随着数据量的增加,它很快就会比第二种更快。
1)使用Pandas :
OrderedDict
从易于学习但很弱到难以学习但很强大的程度来看,In [1]: from collections import OrderedDict
In [2]: import pandas as pd
In [3]: d = OrderedDict([
...: ('JIRAUSER16100', {'name': 'john.smith',
...: 'fullname': 'John Smith',
...: 'email': 'John.Smith@domain.test',
...: 'active': True}),
...: ('JIRAUSER16300', {'name': 'susan.jones',
...: 'fullname': 'Susan Jones',
...: 'email': 'Susan.Jones@domain.test',
...: 'active': True})
...: ])
In [4]: df = pd.DataFrame(d).T
In [5]: df
Out[5]:
name fullname email active
JIRAUSER16100 john.smith John Smith John.Smith@domain.test True
JIRAUSER16300 susan.jones Susan Jones Susan.Jones@domain.test True
In [6]: df.loc[df['name'] == 'susan.jones', 'email'][0]
Out[6]: 'Susan.Jones@domain.test'
远远落后于后者。如果您不熟悉pandas
,可以在这里拆开很多东西,因此,为了简洁起见,我不再赘述。但是,如果有更多的解释会有所帮助,请随时对任何问题发表评论。
2)使用内置的next
功能
这将使您避免循环浏览整个词典。长话短说,您可以向pandas
传递带有三元表达式的生成器,并且该生成器实际上会经过可迭代的过程,直到找到满足给定条件的 first 项。因此,就您而言,
next
会工作。这将为您节省遍历整个字典的时间,但是与选项1不同,它的速度将取决于您要查找的条目在In [7]: next(entry['email'] for entry in d.values() if entry['name'] == 'susan.jones')
Out[7]: 'Susan.Jones@domain.test'
中的位置。除非您出于某种原因只需要坚持使用标准库,否则在任何大小合理的数据集上Pandas的速度都会更快。
希望这会有所帮助!
答案 1 :(得分:0)
如果您要查找特定的匹配项,则必须遍历结构直到找到它为止,这样就不必遍历整个词典。
类似的东西:
if (request.getParameter("search") != null) {
String search = request.getParameter("search");
//it is an integer
if(isInteger(search)){
int searchSin = Integer.getInteger(search);
request.setAttribute("employees", employeeService.getEmployeesSIN(searchSin));
}
//else if it is a string
else{
request.setAttribute("employees", employeeService.getEmployeesLastName(search));
}
}
// check if one string is a integer
private boolean isInteger(String s) {
try {
Integer.parseInt(s);
} catch(NumberFormatException e) {
return false;
} catch(NullPointerException e) {
return false;
}
// only got here if we didn't return false
return true;
}