python - لماذا dict.get(مفتاح) تعمل ولكن لا تملي[مفتاح]؟




dictionary (2)

أحاول تجميع السلاسل الثنائية لأرقام معينة معًا بناءً على عدد 1 الموجود في السلسلة.

هذا لا يعمل:

s = "0 1 3 7 8 9 11 15"
numbers = map(int, s.split())
binaries = [bin(x)[2:].rjust(4, '0') for x in numbers]

one_groups = dict.fromkeys(range(5), [])
for x in binaries:
    one_groups[x.count('1')] += [x]

يجب أن يكون القاموس المتوقع one_groups

{0: ['0000'], 
 1: ['0001', '1000'], 
 2: ['0011', '1001'], 
 3: ['0111', '1011'], 
 4: ['1111']}

لكنني حصلت

{0: ['0000', '0001', '0011', '0111', '1000', '1001', '1011', '1111'], 
 1: ['0000', '0001', '0011', '0111', '1000', '1001', '1011', '1111'], 
 2: ['0000', '0001', '0011', '0111', '1000', '1001', '1011', '1111'], 
 3: ['0000', '0001', '0011', '0111', '1000', '1001', '1011', '1111'], 
 4: ['0000', '0001', '0011', '0111', '1000', '1001', '1011', '1111']}

الشيء الوحيد الذي one_groups[x.count('1')] = one_groups.get(x.count('1')) + [x] حتى الآن هو أنني إذا استخدمت one_groups[x.count('1')] = one_groups.get(x.count('1')) + [x] بدلاً من one_groups[x.count('1')] += [x]

ولكن لماذا هو كذلك؟ إذا كنت أتذكر بشكل صحيح ، أليس من المفترض أن يُرجع dict[key] قيمة هذا القاموس ، على غرار الطريقة التي dict.get(key) بها dict.get(key) ؟ لقد رأيت هذا الموضوع لماذا dict.get (مفتاح) بدلاً من dict [key]؟ لكنها لم KeyError على سؤالي عن هذه الحالة بالذات ، حيث أنني أعرف بالتأكيد أن البرنامج لا يهدف إلى الحصول على KeyError

لقد جربت أيضًا one_groups[x.count('1')].append(x) ولكن هذا لا يعمل أيضًا.


المشكلة هي استخدام one_groups = dict.fromkeys(range(5), [])

(هذا يمرر نفس القائمة كقيمة لجميع المفاتيح. لذلك إذا قمت بتغيير قيمة واحدة ، فستغيرها جميعًا)

يمكنك استخدام هذا بدلاً من ذلك: one_groups = {i:[] for i in range(5)}

(سيتم تنفيذ هذا الشيء "[] (والذي يساوي القائمة ()) لكل مفتاح ، مما يجعل القيم مع قوائم مختلفة.)


المشكلة هي قابلية التغيير:

one_groups = dict.fromkeys(range(5), []) - وهذا يمرر نفس القائمة كقيمة لجميع المفاتيح . لذلك إذا قمت بتغيير قيمة واحدة ، يمكنك تغييرها جميعًا.

هو في الأساس نفس القول:

tmp = []
one_groups = dict.fromkeys(range(5), tmp)
del tmp

إذا كنت تريد استخدام قائمة جديدة ، فأنت بحاجة إلى القيام بذلك في حلقة - إما صريحة للحلقة أو في فهم dict:

one_groups = {key: [] for key in range(5)}

هذا "سيتم" تنفيذه [] (والذي يساوي list() ) لكل مفتاح ، مما يجعل القيم مع قوائم مختلفة.

لماذا get عمل؟ لأنك تأخذ القائمة الحالية بشكل صريح ، لكن + يجعل قائمة نتائج جديدة. ولا يهم ما إذا كان one_groups[x.count('1')] = one_groups.get(x.count('1')) + [x] أو one_groups[x.count('1')] = one_groups[x.count('1')] + [x] - المهم هو أن هناك + .

أعرف كيف يقول الجميع أن a+=b هي a=a+b ، ولكن قد يكون التنفيذ مختلفًا بالنسبة إلى التحسين - في حالة القوائم ، += هو مجرد .extend لأننا نعلم أننا نريد نتيجة في المتغير الحالي ، وبالتالي إنشاء قائمة جديدة ستكون مضيعة للذاكرة.





dictionary