【问题标题】:How do I get union keys of `a` and `b` dictionary and 'a' values? [duplicate]如何获取“a”和“b”字典和“a”值的联合键? [复制]
【发布时间】:2016-01-27 16:50:24
【问题描述】:

我正在做有关处理request.datafrom.cleaned_data 问题的django 项目。当用户仅输入指定字段时,它将向我的服务器发送请求。接下来,表单类处理请求,除了处理输入字段并且从表单内置字段中返回不输入字段。

这是请求数据:

<QueryDict: {u'is_public': [u'True']}>

这是从类中清除的数据:

{'name': u'', 'devie_type': u'', 'is_public': True, 'serial_num': u'', 'is_online': False, 'operation_system': u''}

我知道这些是字典类型。我希望得到他们的联合键和清理数据的值。我希望它返回:

{u'is_public': True}

这是我的尝试:

a = {}
for k in request.data:
    if k in the_form.cleaned_data:
        a[k] = the_form.cleaned_data[k]
print a

它可读吗?或者有没有关于在python中处理联合字典的内置函数?

【问题讨论】:

    标签: python django python-2.7 dictionary django-rest-framework


    【解决方案1】:

    您可以使用交集运算(这听起来像是您真正想要的,而不是联合)来有效地将迭代限制为两个 dicts 共有的键,然后使用 dict 推导相当有效地实现这一点:

    a = {k: the_form.cleaned_data[k]
         for k in request.data.viewkeys() & the_form.cleaned_data.viewkeys()}
    

    因此,当请求和已清理数据中都存在键时,您将拥有从该键到已清理数据的映射。仅出现在一个输入 dict 或另一个中的所有其他键都将被删除。在 Python 3 中,您只需将 .viewkeys() 替换为 .keys()(这在 Python 2.7 之前不起作用,这是引入 .viewkeys() 的地方)。

    【讨论】:

    • 让我编辑我的问题。我的环境是python-2.7
    • @BurgerKing:我以为是。这将在 Python 2.7 上与 .viewkeys() 一起正常工作,为了完整性,我只是包含了 Python 3 的差异。
    • list和list可以做union吗?还是在 python3 上可用?
    • .viewkeys() 不是list,它是一个特殊的“键视图”对象,即dict 键的类似集合的实时视图。在 Python 3 中,.keys() 与 Py 2.7 的 .viewkeys() 相同(.iterkeys() 和返回 list 的 Py2 风格的 .keys() 被删除;视图已经迭代,你可以只包装 .keys()如果您需要实际的 list,请在 list 构造函数中调用)。
    • @BurgerKing:您可以在What's new in Python 3.0: Views and iterators instead of lists 看到更多详细信息,它描述了从生成lists 到生成视图或迭代器/生成器对象有多少内置函数,以减少不必要的创建中间数据副本。
    【解决方案2】:

    你所做的事情本身并没有错,一切都很好。然而,更pythonic的方法是使用字典理解:

    a = {
       k: the_form.cleaned_data[k]
       for k in request.data
       if k in the_form.cleaned_data
    }
    

    【讨论】:

    • 太棒了!这是我想要的。
    • 这与我的回答基本概念相同,尽管它不允许 Python 优化 request.data 字典很大而cleaned_data 很小的情况(因为它必须循环并检查它们all,其中交集操作可以选择迭代较小的输入,而成员资格测试较大的输入,以将工作减少到两个输入长度中较小的一个)。
    【解决方案3】:

    就这样吧:request_data.update(form.cleaned_data)

    【讨论】:

    • 对不起,回报不是我的预期:&lt;QueryDict: {u'name': [u''], u'devie_type': [u''], u'serial_num': [u''], u'opera tion_system': [u''], u'is_online': [False], u'is_public': [u'True', True]}&gt;
    • 我修改了我的答案几次..您尝试了哪一个?
    • 请在发布答案之前检查您的代码。我的期望是{u'is_public': True}
    • 您的问题的标题具有误导性...我的回答正确地发布了两个 dicts 的联合,其中 request_data 获得了 public 除了 的正确值到cleaned_data 的内容 - 这就是union 意味着......这个问题也被关闭,有利于一个允许 union 两个 dicts 的问题,而不是你想要的......
    • 按原样运行,你会明白我的意思:request_data = {u'is_public': [u'True']}cleaned_data = {'name': u'', 'devie_type' : u'', 'is_public': True, 'serial_num': u'', 'is_online': False, 'operation_system': u''} request_data.update(cleaned_data) print request_data
    猜你喜欢
    • 2011-12-23
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 2021-05-09
    • 1970-01-01
    • 2019-01-12
    • 2019-01-19
    相关资源
    最近更新 更多