it-swarm.asia

بيثون: إضافة قائمة لتعيين؟

اختبار على بيثون 2.6 مترجم:

>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> a.add(l)
Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    a.add(l)
TypeError: list objects are unhashable

أعتقد أنه لا يمكنني إضافة القائمة إلى المجموعة لأنه لا توجد طريقة يمكن لبيثون معرفة ما إذا كنت قد أضفت نفس القائمة مرتين. ايوجد اي عمل في هذه المنطقه؟

تحرير: أريد أن أضيف القائمة نفسها ، وليس عناصرها.

183
Adam Matan

لا يمكنك إضافة قائمة إلى مجموعة لأن القوائم قابلة للتغيير ، مما يعني أنه يمكنك تغيير محتويات القائمة بعد إضافتها إلى المجموعة.

ومع ذلك يمكنك إضافة tuples إلى المجموعة ، لأنه لا يمكنك تغيير محتويات Tuple:

>>> a.add(('f', 'g'))
>>> print a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])

تحرير : بعض التفسير: تعرّف الوثائق set كـ مجموعة غير مرتبة من الكائنات المتميزة القابلة للتمييز. يجب أن تكون الكائنات قابلة للقفل بحيث يمكن العثور على العناصر وإضافتها وإزالتها بشكل أسرع من النظر إلى كل عنصر على حدة في كل مرة تقوم فيها بهذه العمليات. يتم شرح الخوارزميات المحددة المستخدمة في مقالة ويكيبيديا . يتم شرح خوارزميات تجزئة Pythons على effbot.org و pythons __hash__ وظيفة في python reference .

بعض الحقائق:

  • تعيين عناصر وكذلك مفاتيح القاموس يجب أن يكون قابل للتزكية
  • بعض أنواع البيانات غير القابلة للتأكيد: [.
    • list: استخدم Tuple بدلاً من ذلك
    • set: استخدم frozenset بدلاً من ذلك
    • dict: ليس له نظير رسمي ، لكن هناك بعض الوصفات
  • تكون مثيلات الكائنات قابلة للتلف بشكل افتراضي مع وجود مثيل فريد لكل مثيل. يمكنك تجاوز هذا السلوك كما هو موضح في مرجع الثعبان.
155
Otto Allmendinger

استخدم set.update() أو |=

>>> a = set('abc')
>>> l = ['d', 'e']
>>> a.update(l)
>>> a
{'e', 'b', 'c', 'd', 'a'}

>>> l = ['f', 'g']
>>> a |= set(l)
>>> a
{'e', 'b', 'f', 'c', 'd', 'g', 'a'}

تحرير: إذا كنت ترغب في إضافة القائمة نفسها وليس أعضاءها ، فيجب عليك استخدام Tuple ، لسوء الحظ. يجب أن يكون أعضاء مجموعة hashable .

413
aehlke

إلى إضافة عناصر القائمة إلى مجموعة ، استخدم update

من https://docs.python.org/2/library/sets.html

s.update (t): مجموعة الإرجاع s مع إضافة عناصر من t

مثلا.

>>> s = set([1, 2])
>>> l = [3, 4]
>>> s.update(l)
>>> s
{1, 2, 3, 4}

إذا كنت بدلاً من ذلك تريد إضافة القائمة بأكملها كعنصر واحد إلى المجموعة ، لا يمكنك ذلك لأن القوائم غير قابلة للتجزئة. يمكنك بدلاً من ذلك إضافة Tuple ، على سبيل المثال s.add(Tuple(l)). راجع أيضًا TypeError: type unhashable: "list" عند استخدام وظيفة مجموعة مدمجة لمزيد من المعلومات حول هذا الموضوع.

65
JDiMatteo

نأمل أن يساعد هذا:

>>> seta = set('1234')
>>> listb = ['a','b','c']
>>> seta.union(listb)
set(['a', 'c', 'b', '1', '3', '2', '4'])
>>> seta
set(['1', '3', '2', '4'])
>>> seta = seta.union(listb)
>>> seta
set(['a', 'c', 'b', '1', '3', '2', '4'])
39
alvas

يرجى ملاحظة الوظيفة set.update(). الوثائق تقول:

تحديث مجموعة مع اتحاد نفسه والآخرين.

14
eggfly

قائمة الكائنات غير قابلة للتلف . قد ترغب في تحويلها إلى tuples رغم ذلك.

8
SilentGhost

لا يمكن أن تحتوي المجموعات على عناصر/أعضاء قابلة للتغيير (قابلة للتغيير). القائمة ، قابلة للتغيير ، لا يمكن أن تكون عضوًا في مجموعة.

لأن مجموعات قابلة للتغيير ، لا يمكن أن يكون لديك مجموعة من مجموعات! يمكنك الحصول على مجموعة من frozensets رغم ذلك.

(ينطبق نفس النوع من "شرط قابلية التغيير" على مفاتيح الإملاء.)

لقد أعطت لك الإجابات الأخرى رمزًا بالفعل ، وآمل أن يكون هذا بمثابة نظرة ثاقبة. آمل أن يجيب أليكس مارتيلي بمزيد من التفاصيل.

5
user135331

تريد إضافة Tuple ، وليس قائمة:

>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> t = Tuple(l)
>>> t
('f', 'g')
>>> a.add(t)
>>> a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])

إذا كان لديك قائمة ، يمكنك التحويل إلى Tuple ، كما هو موضح أعلاه. Tuple غير قابل للتغيير ، لذلك يمكن إضافته إلى المجموعة.

4
hughdbrown

لقد وجدت أنني بحاجة إلى القيام بشيء مماثل اليوم. عرفت الخوارزمية متى كانت تقوم بإنشاء قائمة جديدة تحتاج إلى إضافتها إلى المجموعة ، ولكن ليس متى كانت ستنتهي من التشغيل في القائمة.

على أي حال ، فإن السلوك الذي كنت أريده كان لاستخدام مجموعة id بدلاً من hash. على هذا النحو ، وجدت mydict[id(mylist)] = mylist بدلاً من myset.add(mylist) لتقديم السلوك الذي أردت.

3
Dunes

ستحتاج إلى استخدام tuples ، والتي يمكن تعليقها (لا يمكنك تجزئة كائن قابل للتغيير مثل القائمة).

>>> a = set("abcde")
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> t = ('f', 'g')
>>> a.add(t)
>>> a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])
3
Noah

إليك كيف أفعل ذلك عادة:

def add_list_to_set(my_list, my_set):
    [my_set.add(each) for each in my_list]
return my_set
2
kashif