【问题标题】:Dictionary comparison with tuple as values将元组作为值进行字典比较
【发布时间】:2019-06-06 07:52:14
【问题描述】:

我正在创建一个简单的字典比较来搜索和匹配项目。在这种基本形式中,它可以按预期工作。

def findOrders(lst, **kwargs):
    return [k for k in lst if kwargs.items() <= k.items()]

lst = [i for i in [ {'type':'esimene', 'id':1},
                    {'type':'teine', 'id':2},
                    {'type':'kolmas', 'id':3}]]

print(findOrders(lst, type='esimene'))

现在我想使用元组作为关键字/值来比较/匹配多个“类型”:

findOrders(lst, type=('esimene', 'teine'))

最好的方法是什么?

我可以创建一个生成器,将元组扁平化为 'type':'esimene' 和 'type':'teine' 然后运行比较?它会是什么样子?

效率也很重要,这个功能会被大量使用。

【问题讨论】:

    标签: python dictionary tuples python-3.6


    【解决方案1】:

    您可以检查type参数是否包含每个项目的type属性:

    In [8]: def findOrders(lst, **kwargs):
       ...:     return [k for k in lst if k["type"] in kwargs["type"]]
    
    In [9]: print(findOrders(lst, type='esimene'))
    [{'type': 'esimene', 'id': 1}]
    
    In [10]: print(findOrders(lst, type=('esimene',  'teine')))
    [{'type': 'esimene', 'id': 1}, {'type': 'teine', 'id': 2}]
    

    如果您还想通过id 比较来保持当前逻辑:

    In [32]: def findOrders(lst, **kwargs):
        ...:     return [k for k in lst if k["type"] in kwargs.get("type", (k["type"], )) and k["id"] ==
        ...: kwargs.get("id", k["id"])]
        ...:
        ...:
        ...:
    
    In [33]: print(findOrders(lst, id=1))
    [{'type': 'esimene', 'id': 1}]
    
    In [34]: print(findOrders(lst, type=('esimene',  'teine')))
    [{'type': 'esimene', 'id': 1}, {'type': 'teine', 'id': 2}]
    
    In [35]: print(findOrders(lst, type=('esimene', 'teine'), id=2))
    [{'type': 'teine', 'id': 2}]
    

    【讨论】:

    • 虽然这是一个很好的答案,但我假设 OP 正在寻找一种查询字典的方法。即findOrders(lst, type='esimene')findOrders(lst, type=('esimene', 'teine')findOrders(lst, id=1)
    • @shahkalpesh 正确,这正是我的目标。我试图避免使用 findOrders(lst, type='esimene') 或 findOrders(lst, type='teine') 或者......它既丑陋又低效。
    • 不太关注。你想达到我的答案所缺乏的目标是什么?
    • 我会匹配多个关键字,所以 type 是任何元组,如果提供了 id ,它也会匹配。因此,例如 findOrders(lst, type=('esimene', 'teine'), id=2) 只会返回一个匹配项(id=2)。
    • 我相信这是正确的。我建议您尝试使用 Pandas 实现它 - 我没有太多经验,但也许有一个内置方法可以帮助您。
    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 2021-05-22
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多