0

週のクラスで、月曜日から土曜日の文字列キーを含む.fromkey()メソッドを使用して辞書を作成し、それらをすべて空のリストに初期化しました。

self.weekDict = dict.fromkeys(dayNameList, [])

次に、従業員のリストを反復処理し、各反復内で、就業日を反復処理して、各日の対応するweekDictリストに従業員を追加する関数があります。

def setWeekDict(employees):
            for employee in employees:
                for day in employees[employee].workDays:
                    self.weekDict[day].append(employee)
                    print "employee: " + employee
                    print "weekday/list: " + str(day) + str(self.weekDict[day])

weekDictリストには、特定の日に作業するようにスケジュールされているすべての人が反映されると思います。代わりに、毎日のリストには、従業員のために1日に繰り返した合計回数が累積されているように見えます。私のprintステートメントはこれを出力します:

employee: Addison
weekday/list: Saturday['Addison']
employee: Addison
weekday/list: Monday['Addison', 'Addison']
employee: Addison
weekday/list: Tuesday['Addison', 'Addison', 'Addison']
employee: Addison
weekday/list: Wednesday['Addison', 'Addison', 'Addison', 'Addison']
employee: Addison
weekday/list: Thursday['Addison', 'Addison', 'Addison', 'Addison', 'Addison']

明らかに、「Addison」または他の従業員を1日1回だけ表示したいのですが、forループで、従業員名+従業員名が追加された回数を追加する各リストに何が貢献するのか理解できません。以前の他のリスト。dict.fromkeys()が実際にはすべて同じリストを指すキーを作成するとしか思えませんが、それがfromkeys()関数の仕組みだとは思いませんでした。

4

1 に答える 1

2

fromkeys()id()可変オブジェクトとともに使用すると、ディクショナリのすべてのキーに同じオブジェクト(同じ)が割り当てられるため、このような動作が発生する可能性があります。

In [16]: dic=dict.fromkeys("spam",[])

In [17]: [id(x) for x in dic.values()]    #all of them are same objects
Out[17]: [141885196, 141885196, 141885196, 141885196]

In [18]: dic['s'].append(1)   #changing one changes others as well

In [19]: dic
Out[19]: {'a': [1], 'm': [1], 'p': [1], 's': [1]}

したがって、dict-comprehensions可変オブジェクトで使用する必要があります。

In [20]: dic={x:[] for x in "spam"}

In [21]: [id(x) for x in dic.values()]               #unique objects
Out[21]: [141884972, 141848300, 142262988, 141895980]

In [22]: dic['s'].append(1)

In [23]: dic
Out[23]: {'a': [], 'm': [], 'p': [], 's': [1]}
于 2013-01-10T19:47:09.943 に答える