簡體   English   中英

使用`defaultdicts`的Python程序無法正常工作

[英]Python program using `defaultdicts` doesn't work as expected

預期結果:

main_dict = { 
                'a':
                    { 0: 'Letter a',
                      1: 'Letter a',
                      2: 'Letter a',},

                'b':
                    { 0: 'Letter b',
                      1: 'Letter b',
                      2: 'Letter b',},

                'c':
                    { 0: 'Letter c',
                      1: 'Letter c',
                      2: 'Letter c',}

             }

我的程序,版本1; 預期結果就是輸出。

# my_program.py
def fill_dict(a_dict, a_key):

    if not a_dict.has_key(a_key):
        a_dict[a_key] = {}

    for i in xrange(3):
        a_dict[a_key][i] = 'Letter {}'.format(a_key)

def main():
    main_dict = {}

    a_list = ['a', 'b', 'c']

    for item in a_list:
        fill_dict(main_dict, item)

if __name__ == '__main__':
    main()

使用defaultdicts重構程序; 結果是main_dict = {}

# defaultdict_test.py
import collections

def fill_dict(a_dict, a_key):

    a_dict = collections.defaultdict(dict)

    for i in xrange(3):
        a_dict[a_key][i] = 'Letter {}'.format(a_key)

def main():
    main_dict = {}

    a_list = ['a', 'b', 'c']

    for item in a_list:
        fill_dict(main_dict, item)

if __name__ == '__main__':
    main()

關於我在做什么的任何指示? 謝謝。

main_dict fill_dict傳遞給fill_dict ,然后將新的defaultdict分配給局部變量a_dict 您永遠不會將這個價值傳遞出去。

在有效的程序中,您無需重新分配本地,因此,當您在a_dict上調用方法時,您正在修改傳入的值,該值是main中的main_dict值。

重新分配和方法變異之間的區別是微妙而重要的。 本文提供了有關名稱,值及其相互作用的更多信息: 有關Python名稱和值的事實和神話

指標:

  1. 在您的第一個版本中使用vs has_key 方法has_key已在Python 3中被描述並刪除
  2. 除去a_dict = collections.defaultdict(dict)fill_dict
  3. 變化main_dict = {}main_dict = collections.defaultdict(dict)main

做完了!

import collections

def fill_dict(a_dict, a_key):
    for i in xrange(3):
        a_dict[a_key][i] = 'Letter {}'.format(a_key)        

def main():
    main_dict = collections.defaultdict(dict)

    a_list = ['a', 'b', 'c']

    for item in a_list:
        fill_dict(main_dict, item)

最后的指針:了解列表,設置和命令理解。 您可以在一行中完成以下數據結構:

>>> {c:{i: 'Letter {}'.format(c) for i in range(3)} for c in 'abc'}
{'a': {0: 'Letter a', 1: 'Letter a', 2: 'Letter a'}, 'c': {0: 'Letter c', 1: 'Letter c', 2: 'Letter c'}, 'b': {0: 'Letter b', 1: 'Letter b', 2: 'Letter b'}}

如果您看一下-如果以這種方式格式化,它幾乎是您想要的結果的一個版本:

dict_you_want={
                   c:
                       {  i: 'Letter {}'.format(c) 
                            for i in range(3)  }   # , 

                      for c in 'abc'
              }

它會像我在那里一樣執行...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM