اذهب إلى المحتوى

السؤال

نشر

السلام عليكم، كنت أريد استعمال set كمفتاح في قاموس في البايثون و لكن عندما أكتب التالي:

s = set()
s.add(2)
s.add(3)
print(s)

d = dict()
d[s] = 1
print(d)

يظهر لي الخطأ التالي:

TypeError: unhashable type: 'set'

ما معنى الخطأ السابق و هل يمكن استعمال ال set بطريقة ما كمفتاح؟

Recommended Posts

  • 1
نشر

إن القاموس في البايثون يعتمد على ما يسمى hash function للقيام بإيجاد سريع لمكان المفتاح، و هذه القيمة لا يجب أن تتغير من أجل الأداء و بسبب ذلك لا يمكن استعمال أي نمط قابل للتغيير mutable كمفتاح في البايثون.

يمكنك استعمال tuple بدلا من ذلك، و إن كنت تريد استعمال شيء مشابه لل set من أجل خواص معينة ضمنها فيمكن استعمال نسخة أخرى غير قابلة للتعديل و هي ال frozenset بالشكل التالي:

s = set()
s.add(2)
s.add(3)
print(s)

d = dict()
d[frozenset(s)] = 1
print(d)

 

  • 0
نشر

لا يمكننا استخدام set كمفتاح في قاموس أو كعنصر في مجموعة أخرى لأن الكائنات المحددة قابلة للتغيير وغير قابلة للتجزئة.

تتمثل إحدى طرق حل الخطأ في استخدام مجموعة التجميد. 

سأستخدم مثال من عندي بالإضافة الى المثال الذي شرحه الأخ حسان لتتضح لك الصورة :

my_set = {'hsoub', 'mostaql'}

#  باستخدام مجموعة كعنصر في مجموعة أخرى
# يظهر لنا هذا المشكل
#  TypeError: unhashable type: 'set'
another_set = {'ana', 'academy', my_set}

# باستخدام مجموعة كمفتاح في القاموس
# يظهر لنا هذا المشكل
#  TypeError: unhashable type: 'set'
my_dict = {my_set: 'hsoub'}

تتمثل إحدى طرق حل الخطأ في استخدام مجموعة التجميد "frozenset"

my_set = frozenset({'hsoub', 'mostaql'})


another_set = {'ana', 'academy', my_set}
print(another_set)  # => {'academy', frozenset({'mostaql', 'hsoub'}), 'ana'}

# التحقق مما إذا كان العنصر في المجموعة
print(frozenset({'mostaql', 'hsoub'}) in another_set)  # => True

# ---------------------------------------------------------------

my_dict = {my_set: 'khamsat'}
print(my_dict)  # => {'academy', frozenset({'ana', 'academy'}), 'mostaql'}


# الوصول إلى المفتاح في القاموس
print(my_dict[frozenset({'hsoub', 'mostaql'})])  # 👉️ khamsat

مجموعة frozenset هي نسخة غير قابلة للتغيير من كائن مجموعة Python ، لذا يمكن استخدامها كمفتاح في قاموس أو عنصر في مجموعة أخرى.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...