Tek bir elemanla demet nasıl oluşturulur


107

Aşağıdaki örnekte tüm elemanların tuple olmasını beklerdim, neden bir demet sadece tek bir dize içerdiğinde bir dizgeye dönüştürülür?

>>> a = [('a'), ('b'), ('c', 'd')]
>>> a
['a', 'b', ('c', 'd')]
>>> 
>>> for elem in a:
...     print type(elem)
... 
<type 'str'>
<type 'str'>
<type 'tuple'>

1
('a')sadece değerlendirir'a'
oldrinb

1
Vay canına - 3 dakikada 3 doğru cevap :) Ancak, sırrına dikkat edin ,:a = 1, 2, 3; print a

26
Parantezler bir demet oluşturmaz, virgül yapar.
cdarke

17
@cdarke, ()yalnızca bir çift parantezden oluşan boş demet hariç .
Frédéric Hamidi

2
Doğru, ya da daha doğrusu False- neredeyse boş bir demet için iyidir (ne demek istediğimi anlıyorsanız).
cdarke

Yanıtlar:


141

Çünkü bu ilk iki öğe tuple değil; onlar sadece dizeler. Parantez onları otomatik olarak dizilemez. Python'a bir demet olması gerektiğini belirtmek için dizeden sonra bir virgül eklemelisiniz.

>>> type( ('a') )
<type 'str'>

>>> type( ('a',) )
<type 'tuple'>

Örnek kodunuzu düzeltmek için buraya virgül ekleyin:

>>> a = [('a',), ('b',), ('c', 'd')]

             ^       ^

Gönderen Python Dokümanlar :

Özel bir sorun, 0 veya 1 öğe içeren tuple'ların oluşturulmasıdır: sözdiziminde bunları karşılamak için bazı ekstra tuhaflıklar vardır. Boş demetler, boş bir parantez çifti ile oluşturulur; tek öğeli bir demet, bir değeri virgülle takip ederek oluşturulur (tek bir değeri parantez içine almak yeterli değildir). Çirkin ama etkili.

Sondaki virgül sözdiziminden gerçekten nefret ediyorsanız list, tuple()işleve bir çözüm a iletmektir :

x = tuple(['a'])

7
Yine de bu çok zarif değil ve biraz kafa karıştırıcı görünüyor. Başka bir yolu var mı?
Robert Moore

3
Bu işe yaramıyor gibi görünüyor. Örneğin: tuple ("abc") (ekstra virgülle veya virgül olmadan) ('a', 'b', 'c') verirken ("abc",) ('abc') verir. Dolayısıyla tuple () burada uygun bir seçenek olarak görünmüyor.
Ben Farmer

3
@Ben Dokümanlara bir göz atın . tuple Bir kabul iterable bir dize (karakterler üzerinde dolaşır) 'dir. Eğer sondaki virgül kullanmayan ısrar, o zaman bir ara liste yapın: tuple(['abc']).
Jonathon Reinhart

Elbette, sadece tuple işlevinin virgül ihtiyacını ortadan kaldırmadığını söylüyorum.
Ben Farmer

1
@matanster Bu bağlamda dil sözdizimi değişmemiştir. AFAIK sorunu Python 2 ve 3 için aynı.
Jonathon Reinhart

20

İlk iki örneğiniz tuple değil, dizelerdir. Tek öğeli tuples, aşağıdaki gibi bir virgül gerektirir:

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]

11

('a') bir demet değil, sadece bir dizedir.

Bunları şu şekilde pythonalmak için sonuna fazladan virgül eklemeniz gerekir tuple: -

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]
>>> 
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.