【问题标题】:Updating a dictionary in python在 python 中更新字典
【发布时间】:2015-06-24 01:07:00
【问题描述】:

我已经被这个问题困住了很长一段时间,只是想不通。我只是想能够理解我缺少什么以及为什么需要它。 我需要做的是创建一个函数,将每个给定的键/值对添加到字典中。参数 key_value_pairs 将是 (key, value) 形式的元组列表。

def add_to_dict(d, key_value_pairs):

    newinputs = [] #creates new list
    for key, value in key_value_pairs:
        d[key] = value #updates element of key with value
        if key in key_value_pairs:
            newinputs.append((d[key], value)) #adds d[key and value to list
    return newinputs

当 d 和 key_value_pairs 有不同的键时,我不知道如何更新“value”变量。

前三个场景有效,但其余的都失败了

>>> d = {}
>>> add_to_dict(d, [])
[]
>>> d
{}

>>> d = {}
>>> add_to_dict(d, [('a', 2])
[]
>>> d
{'a': 2}

>>> d = {'b': 4}
>>> add_to_dict(d, [('a', 2)])
[]
>>> d
{'a':2, 'b':4}

>>> d = {'a': 0}
>>> add_to_dict(d, [('a', 2)])
[('a', 0)]
>>> d
{'a':2}

>>> d = {'a', 0, 'b': 1}
>>> add_to_dict(d, [('a', 2), ('b': 4)])
[('a', 2), ('b': 1)]
>>> d
{'a': 2, 'b': 4}

>>> d = {'a': 0}
>>> add_to_dict(d, [('a', 1), ('a': 2)])
[('a', 0), ('a':1)]
>>> d
{'a': 2}

谢谢

已编辑。

【问题讨论】:

  • dict.update 有什么问题?
  • 抱歉,这些输出是您得到的还是您想要的?
  • 您能否展示您在每种情况下获得的输出与您期望的输出?
  • key in key_value_pairs 通常为假,因为key_value_pairs 是一个元组列表,但在大多数情况下key 不是一个元组
  • 你的问题对我来说不是很清楚(对于其他人来说,我猜每个答案都是不同的)你考虑你的第一个例子 add_to_dict(d, [('a', 2)])无效?你会期待 {'a':2, 'a': 0} 吗?

标签: python python-3.x dictionary


【解决方案1】:

新版 Python3.9 引入了两个新的字典运算符:联合(|)和就地联合(|=)。您可以使用 |合并两个字典,而 |= 将就地更新字典。让我们考虑 2 个字典 d1d2

d1 = {"name": "Arun", "height": 170}
d2 = {"age": 21, "height": 170}
d3 = d1 | d2 # d3 is the union of d1 and d2
print(d3)

输出:

{'name': 'Arun', 'height': 170, 'age': 21}

用 d2 更新 d1

d1 |= d2
print(d1)

输出:

{'name': 'Arun', 'height': 170, 'age': 21}

您可以将 d1 更新为新的密钥权重

d1 |= {"weight": 80}
print(d1)

输出:

{'name': 'Arun', 'height': 170, 'age': 21, 'weight': 80}

【讨论】:

    【解决方案2】:

    使用python 3.9,您可以使用|= update operator

    >>> d = {'b': 4}
    >>> d |= {'a': 2}
    >>> d
    {'a': 2, 'b': 4}
    

    【讨论】:

      【解决方案3】:

      与 Eric 的第二个 sn-p 相比,这是一个更优雅的解决方案

      >>> a = {'a' : 1, 'b' : 2}
      >>> b = {'a' : 2, 'c' : 3}
      >>> c = dict(a, **b)
      >>> a
      {'a': 1, 'b': 2}
      >>> b
      {'a': 2, 'c': 3}
      >>> c
      {'a': 2, 'b': 2, 'c': 3}
      

      它适用于 Python 2 和 3

      当然还有更新方法

      >>> a
      {'a': 1, 'b': 2}
      >>> b
      {'a': 2, 'c': 3}
      >>> a.update(b)
      >>> a
      {'a': 2, 'b': 2, 'c': 3}
      

      但是,要小心后者,因为如果像这里这样的滥用可能会导致问题

      >>> a = {'a' : 1, 'b' : 2}
      >>> b = {'a' : 2, 'c' : 3}
      >>> c = a
      >>> c.update(b)
      >>> a
      {'a': 2, 'b': 2, 'c': 3}
      >>> b
      {'a': 2, 'c': 3}
      >>> c
      {'a': 2, 'b': 2, 'c': 3}
      

      【讨论】:

        【解决方案4】:

        Python 内置了这个功能:

        >>> d = {'b': 4}
        >>> d.update({'a': 2})
        >>> d
        {'a': 2, 'b': 4}
        

        或者如果你不允许使用dict.update

        >>> d = dict(d.items() + {'a': 2}.items())   # doesn't work in python 3
        

        【讨论】:

        • 我必须通过只使用循环和语句来实现这一点
        • @KanadeSwag:这“只是一个声明”。这些规则毫无意义,因为它们允许所有 python 代码
        • 我的意思是 if 语句,对不起
        • @KanadeSwag:这也是一组错误的规则,因为您还需要赋值、密钥访问、算术。您可以使用哪些内置函数,哪些不能使用?
        【解决方案5】:

        如果我理解正确,您只想添加字典中不存在的键。代码如下:

        def add_to_dict(d, key_value_pairs):
            newinputs = [];
            for key, value in key_value_pairs:
                if key not in d.keys():
                    d[key] = value
                    newinputs.append((key, value));
            return newinputs
        

        对于新键、值对列表中的每个键,您必须检查该键是否是字典中的新键,然后才添加它。 希望对您有所帮助;)

        【讨论】:

          【解决方案6】:

          python dict 中的每个键都对应一个值。 dkey_value_pairs 具有不同键的情况不是相同的元素。

          newinputs 是否应该包含以前在 d 中不存在的键/值对?如果是这样:

          def add_to_dict(d, key_value_pairs):
            newinputs = []
            for key, value in key_value_pairs:
              if key not in d:
                newinputs.append((key, value))
              d[key] = value
            return newinputs
          

          newinputs 是否应该包含键/值对,其中键 存在于 d 中,然后发生更改?如果是这样:

          def add_to_dict(d, key_value_pairs):
            newinputs = []
            for key, value in key_value_pairs:
              if key in d:
                newinputs.append((key, value))
              d[key] = value
            return newinputs
          

          【讨论】:

            【解决方案7】:

            因此,如果我理解正确,您希望返回一个包含 (key, old_value) 的元组列表,用于替换被替换的键。

            您必须在替换之前保存旧值:

            def add_to_dict(d, key_value_pairs):
            
                newinputs = [] #creates new list
                for key, value in key_value_pairs:
                    if key in d:
                        newinputs.append((key, d[key]))
                    d[key] = value #updates element of key with value
                return newinputs
            

            【讨论】:

              猜你喜欢
              • 2014-10-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-07-18
              • 1970-01-01
              • 2021-10-01
              • 2017-10-05
              相关资源
              最近更新 更多