【问题标题】:Python: How can I modify dictionary values in a for loop alternating the keys?Python:如何在 for 循环中交替键修改字典值?
【发布时间】:2011-07-14 00:02:41
【问题描述】:

我是 Python 新手(和编程)。

我想通过交替字典的键来修改 for 循环中的字典。我写了以下代码,但是失败了:

#coding: utf-8
dict1 = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
dict2 = dict.fromkeys(dict1.values(),[])

for key in dict2:
    if key == 'value1':
        dict2[key].extend(['test1', 'test2'])
    elif key == 'value2':
        dict2[key].extend(['test3', 'test4'])
    elif key == 'value3':
        dict2[key].extend(['test5', 'test6'])

print (dict2['value1'])
print (dict2['value3'])

我预计结果是:

 ['test5', 'test6']
 ['test1', 'test2']

但我实际上得到了:

 ['test5', 'test6', 'test3', 'test4', 'test1', 'test2']
 ['test5', 'test6', 'test3', 'test4', 'test1', 'test2']

我猜这个问题可能来自我使用“dict.fromkeys”从另一个字典制作字典,但即使是这样,我也看不出它为什么会出现问题。

感谢您的关注。期待您的建议。

【问题讨论】:

    标签: python loops dictionary for-loop key


    【解决方案1】:

    dict2 的所有值实际上都是同一个列表实例,因为将[] 传递给dict.fromkeys() 只会创建一个列表实例。试试

    dict2 = dict((v, []) for v in dict1.values())
    

    【讨论】:

    • 我得到了我预期的结果,我明白我错过了什么。谢谢!
    • @miyazaki_tara:如果你最喜欢这个答案,你应该接受它。
    【解决方案2】:

    问题是你使用了一个可变对象作为值初始化器。每个值都是同一个对象。

    Python2> dict1 = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
    Python2> dict2 = dict.fromkeys(dict1.values(),[])
    Python2> dict2
    {'value1': [], 'value2': [], 'value3': []}
    Python2> dict2['value1']
    []
    Python2> id(dict2['value1'])
    43895336
    Python2> id(dict2['value2'])
    43895336
    Python2> id(dict2['value3'])
    43895336
    

    所以你正在扩展同一个列表。

    【讨论】:

      【解决方案3】:

      遍历yourdict.keys()(这会返回一个列表,因此它不会受到对字典的任何更改的影响)

      【讨论】:

      • 循环内只修改字典值,这很好。
      【解决方案4】:

      问题是dict.fromkeys() 用相同的对象初始化每个项目

      dict2 = dict((x, []) for x in dict1.values())
      

      【讨论】:

      • 谢谢!我现在明白我错过了什么。
      【解决方案5】:

      正如其他人指出的那样,问题在于您对dict.fromkeys() 的调用会将对同一空列表的引用与它在新字典中创建的每个键关联起来。一个简单的解决方案是从collections 模块中将dict2 设为defaultdict 类,并将默认值设为单独的新创建的空list

      from collections import defaultdict
      
      dict1 = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
      dict2 = defaultdict(list)
      
      for key in dict1.itervalues():
          if key == 'value1':
              dict2[key].extend(['test1', 'test2'])
          elif key == 'value2':
              dict2[key].extend(['test3', 'test4'])
          elif key == 'value3':
              dict2[key].extend(['test5', 'test6'])
      
      print dict2['value1']
      # ['test1', 'test2']
      print dict2['value3']
      # ['test5', 'test6']
      

      【讨论】:

        猜你喜欢
        • 2021-11-18
        • 1970-01-01
        • 2013-08-05
        • 1970-01-01
        • 2021-09-22
        • 2023-03-14
        • 2017-09-28
        • 1970-01-01
        • 2018-12-01
        相关资源
        最近更新 更多