如何从键值匹配中找到键值?

时间:2020-03-24 01:17:22

标签: python dictionary ordereddictionary

我有一个很长的命令字典,看起来像这样:

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

2 个答案:

答案 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;
}