Soru Python: Ayarlamak için liste ekle?


Python 2.6 yorumlayıcıda test edildi:

>>> 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 forma ekleyemediğimi düşünüyorum çünkü Python'un aynı listeyi iki kez eklediğimde söyleyebilecek bir yolu yoktur. Bir çözüm var mı?

EDIT: Listenin kendisini değil, listeyi eklemek istiyorum. 


156
2017-08-20 14:35


Menşei


Listeyi listeye veya listeye eklemek ister misiniz? - pkit
Liste kendisi - Listelerden birine sahip olmak istiyorum. - Adam Matan
Ardından Otto'nun cevapladığı tuple seçeneğini kullanın. - pkit


Cevaplar:


Bir listeye liste ekleyemezsiniz çünkü listeler değişken olabilir, yani listenin içeriğini kümeye ekledikten sonra değiştirebilirsiniz.

Bununla birlikte, bir tuple içeriğini değiştiremeyeceğiniz için kümeye tuple ekleyebilirsiniz:

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

Düzenle: biraz açıklama: Belge, bir set gibi Farklı yıkanabilir nesnelerin sırasız bir koleksiyonu. Nesnelerin yıkanabilir olması gerekir, böylece her bir elemanın bu işlemleri gerçekleştirirken, bulma, toplama ve çıkarma elemanlarının her bir elemandan daha hızlı yapılabilmesi. Kullanılan özel algoritmalar açıklanmıştır. Wikipedia makalesi. Pythons hashing algoritmaları açıklanmıştır. effbot.org ve pitonlar __hash__ işlevinde python referansı.

Bazı gerçekler:

  • Öğeleri ayarla Hem de sözlük tuşları yıkanabilir olmalı
  • Bazı şaşmaz veri tipleri:
    • list: kullan tuple yerine
    • set: kullan frozenset yerine
    • dict: Resmi bir karşılığı yoktur, ancak bazı yemek tarifleri
  • Nesne örnekleri, her örnek benzersiz bir karma sahip varsayılan olarak yıkanabilir. Bu davranışı python referansında açıklandığı gibi geçersiz kılabilirsiniz.

139
2017-08-20 14:39



Bir kümeye set eklemek isterseniz, frozenset kullanın. - FogleBird
collections.namedtuple "resmi" olarak kabul edilebilir dict. - SilentGhost
@FogleBird veya sendika operatörü: | = - aehlke
@Wahnfrieden: Bu ekliyor içindekiler kümenin kendisi değil, kümenin kendisi. - Otto Allmendinger
İyi cevap verdi. Tuple () işlevi de denenmeye değer. - Adam Matan


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

Sendika operatörü zaten eklemek daha hızlıdır.

edit: Listenin kendisini ve üyelerini istemiyorsanız, maalesef bir tuple kullanmalısınız. Set üyeleri yıkanabilir olmalıdır.


356
2017-08-20 14:41



a.update(l) aynı etkiye sahiptir. - kawing-chiu


için listenin öğelerini bir kümeye ekle, kullan update

itibaren https://docs.python.org/2/library/sets.html

s.update (t): t eklenmiş öğelerle birlikte get set

Örneğin.

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

Onun yerine istersen tüm listeyi tek bir öğe olarak ekleyin sete, yapamazsınız çünkü listeler yıkanabilir değil. Bunun yerine bir tuple ekleyebilirsiniz, ör. s.add(tuple(l)). Ayrıca bakınız TypeError: ayrılmaz tip: yerleşik set fonksiyonu kullanılırken 'liste' Bunun hakkında daha fazla bilgi için.


44
2018-05-02 20:01





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

38
2017-08-23 09:24





Lütfen fonksiyonu dikkat edin set.update(). Belgeler diyor ki:

Bir seti kendi ve diğerlerinin birliği ile güncelleyin.


14
2018-05-05 12:01



Bu soruyu cevaplamıyor (OP, listenin kendisini listeye eklemeyi istediği için) ama Google'ın beni buraya getirdiğinde ihtiyaç duyduğum cevap buydu :-) - tom stratton
Eh, bana soruya en uygun cevap gibi görünüyor ... örneğin, b = set ([1]), b.update ([7,25]) b aşağıdaki değer verecektir: set ([ 1, 25, 7]) ---> Burada aradığımız şey bu değil mi? - Louis LC


liste nesneleri paylaşılmaz. onları yine de tuple çevirmek isteyebilirsiniz.


8
2017-08-20 14:43





Setler değişebilir (değiştirilebilir) elemanlara / üyelere sahip olamaz. Değişebilir olan bir liste, bir kümenin üyesi olamaz.

Setler değişebilir olduğundan, bir dizi setiniz olamaz! Yine de bir dizi frozensetin olabilir.

(Aynı tür "mutabilite şartı", bir diksiyonun anahtarları için geçerlidir.)

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


5
2017-08-20 14:47





Bir liste eklemek değil, bir liste eklemek istersiniz:

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

Bir listeniz varsa, yukarıda gösterildiği gibi, tuple dönüştürebilirsiniz. Bir tuple değişmezdir, bu yüzden sete eklenebilir.


4
2017-08-20 14:47



ihtiyacın yok tuple(x for x in l), sadece yapabilirsin: tuple(l) - SilentGhost
Ah doğru. Parmaklarıma sıkışmış liste anlama sözdizim var. - hughdbrown