Ayarlanacak liste eklensin mi?


242

Python 2.6 yorumlayıcısında test edilmiştir:

>>> 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

Listeyi kümeye ekleyemediğimi düşünüyorum çünkü Python'un aynı listeyi iki kez eklediysem söyleyebileceği bir yol yok. Bir çözüm var mı?

EDIT: Listenin kendisini eklemek istiyorum, öğeleri değil.


2
Listeyi sete veya listedeki öğelere eklemek ister misiniz?
pkit

Listenin kendisi - Bir dizi listeye sahip olmak istiyorum.
Adam Matan

En uygun cevabın önemsiz olduğu anlaşılıyor, bunu yaptığınızdan emin olmak için lst kendisini bazı listeye / kuyruğa / vb. Kabul edilen cevabı tekrar gözden geçirmelisiniz.
Rustam A.

Yanıtlar:


187

Listeler değiştirilebilir olduğu için bir gruba liste ekleyemezsiniz, yani listeyi gruba ekledikten sonra içeriğini değiştirebilirsiniz.

Bununla birlikte, bir grubun içeriğini değiştiremediğiniz için sete tuples ekleyebilirsiniz:

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

Düzenleme : bazı açıklama: Dokümantasyon, farklı yıkanabilir nesnelerin sırasız bir koleksiyonuset olarak tanımlar . Nesnelerin yıkanabilir olması gerekir, böylece bu işlemleri her gerçekleştirdiğinizde elemanların bulunması, eklenmesi ve çıkarılması her bir öğeye bakmaktan daha hızlı yapılabilir. Kullanılan spesifik algoritmalar Wikipedia makalesinde açıklanmıştır . Pythons karma algoritmaları effbot.org ve pythons__hash__ fonksiyonlarında python referansında açıklanmıştır .

Bazı gerçekler:

  • Sözlük öğelerinin yanı sıra set öğeleri de yıkanabilir olmalıdır
  • Bazı paylaşılamaz veri türleri:
    • list: tuplebunun yerine kullan
    • set: frozensetbunun yerine kullan
    • dict: resmi bir muadili yok, ancak bazı tarifler var
  • Nesne örnekleri varsayılan olarak yıkanabilir ve her örnek benzersiz bir karmaya sahiptir. Bu davranışı python başvurusunda açıklandığı gibi geçersiz kılabilirsiniz.

6
Ve eğer bir sete bir set eklemek isterseniz, frozenset kullanın.
FogleBird

4
collections.namedtuple"resmi" muadili sayılabilir dict.
SilentGhost

1
@Wahnfrieden: bu setin içeriğini değil, bir setin içeriğini ekler .
Otto Allmendinger

@aehlke: Hayır, bu, kümenin öğelerini ilk kümeye ekler, ancak ilk kümenin öğesi olarak bir küme eklemekten bahsediyoruz.
Jeff Learman

578

set.update()Veya kullanın|=

>>> 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'}

edit: Listenin kendisini değil üyelerini eklemek istiyorsanız, maalesef bir demet kullanmalısınız. Set elemanları yıkanabilir olmalıdır .


set.update () listeyi kümeye ekler, değil mi? boru operatöre eşittir?
FistOfFury

Setlerle ilgili olarak, |operatör set birliği işlemini uygular . Hem |=operatör hem de set.update()yöntem bu işlemi yerinde uygular ve etkili bir şekilde eşanlamlıdır. Bu nedenle, set_a |= set_bher ikisi için sözdizimsel şeker olarak düşünülebilir set_a.update(set_b) ve set_a = set_a | set_b (ikinci durumda, aynı set_anesnenin yeniden atanmak yerine yeniden kullanılması dışında). </ahem>
Cecil Curry

76

İçin bir dizi için bir listenin elemanlarını eklemek , kullanımupdate

Gönderen https://docs.python.org/2/library/sets.html

s.update (t): t öğesinden eklenmiş öğelerle dönüş kümeleri

Örneğin

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

Bunun yerine tüm listeyi kümeye tek bir öğe olarak eklemek isterseniz, listeler yıkanamaz olduğundan bunu yapamazsınız. Bunun yerine bir demet ekleyebilirsiniz, örn s.add(tuple(l)). Bununla ilgili daha fazla bilgi için yerleşik set işlevini kullanırken bkz. TypeError: unhashable type: 'list' .


40

Umarım bu yardımcı olur:

>>> 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'])

15

Lütfen işleve dikkat edin set.update(). Belgeler diyor ki:

Bir seti kendisinin ve başkalarının birleşmesiyle güncelleyin.


5
Bu soruya cevap vermiyor (OP listenin kendisini listeye eklemek istediğinden), ancak Google beni buraya getirdiğinde ihtiyacım olan cevaptı :-)
tom stratton

1
Bana soruya en uygun cevap gibi geliyor ... örneğin, eğer b = set ([1]), b.update ([7,25]) b şu değeri verecektir: set ([ 1, 25, 7]) ---> Burada aradığımız şey bu değil mi?
Louis LC

8

liste nesneleri paylaşılamaz . yine de onları tuples'e çevirmek isteyebilirsiniz.


5

Setlerin değiştirilebilir (değiştirilebilir) elemanları / üyeleri olamaz. Değişebilen bir liste bir kümenin üyesi olamaz.

Setler değiştirilebilir olduğu için bir set setiniz olamaz! Gerçi bir dizi frozensets olabilir.

(Bir diktenin anahtarları için aynı tür "değişebilirlik şartı" geçerlidir.)

Diğer cevaplar size zaten kod verdi, umarım bu biraz fikir verir. Alex Martelli'nin daha fazla ayrıntıyla cevap vermesini umuyorum.


4

Liste eklemek yerine bir demet eklemek istiyorsunuz:

>>> 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')])

Listeniz varsa, yukarıda gösterildiği gibi gruba dönüştürebilirsiniz. Bir demet değiştirilemez, bu nedenle sete eklenebilir.


4

Bugün benzer bir şey yapmam gerektiğini buldum. Algoritma, kümeye eklenmesi gereken yeni bir liste oluşturduğunu biliyordu, ancak listede çalışmayı bitirdiğini bilmiyordu.

Her neyse, istediğim davranış kullanmak idyerine ayarlanmıştı hash. Böylece istediğim davranışı sunmak mydict[id(mylist)] = mylistyerine buldum myset.add(mylist).


3

Yıkanabilir tuples kullanmak isteyeceksiniz (liste gibi değiştirilebilir bir nesne hash edemezsiniz).

>>> 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')])

2

Ben genellikle nasıl yaparım:

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

-4

Bu şunları yapmalıdır:

set(tuple(i) for i in L)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.