Bir liste nasıl "düzgün" yazdırılır?


95

Bu yüzden bir listem var:

['x', 3, 'b']

Ve çıktının şöyle olmasını istiyorum:

[x, 3, b]

Bunu python'da nasıl yapabilirim?

Eğer yaparsam str(['x', 3, 'b']), alıntılı bir tane alırım, ama alıntı istemiyorum.


Listenin neden "düzgün" yazdırılmadığını açıklamak için, print(["Sam"])aradığınızda repr("Sam")ve geri dönen python çağrılarının (tırnak işaretleri olmadan 'Sam') aksine, dönen print("Sam")çağrılar (tırnak işaretleri ile). Daha fazla bilgi için ve veya Python ve s arasındaki farkı görün . str("Sam")Samstrreprstrlist
Anonim

Yanıtlar:


189

Python 2'de:

mylist = ['x', 3, 'b']
print '[%s]' % ', '.join(map(str, mylist))

Python 3'te ( printartık bir sözdizimi özelliği değil yerleşik bir işlevdir):

mylist = ['x', 3, 'b']
print('[%s]' % ', '.join(map(str, mylist)))

Her ikisi de dönüş:

[x, 3, b]

Bu, map()işlevin her bir mylist öğesi için str'yi çağırmak ve daha sonra tek bir dizede birleştirilen yeni bir dizge listesi oluşturmaktır str.join(). Ardından, %operatöre biçimlendirme dize içinde yerine dizesinin %siçinde "[%s]".


4
Teşekkür ederim harika çalışıyor. İkinci satırda ne yaptığınızı biraz ayrıntılı olarak açıklayabilir misiniz? Python'da yeniyim.
Obaid

19
mapİşlevi, ströğesinin her bir öğesini çağırmak için kullanıyor ve mylistdaha sonra tek bir dizede birleştireceği yeni bir dizge listesi oluşturuyor str.join. Sonra, o kullanır %içinde yerine dize yerine operatörün biçimlendirme dize %siçinde "[%s]".
li.davidm

6
Bunu yapmanın başka bir yolu da biraz daha modern olabilir: "[{0}]".format(", ".join(str(i) for i in mylist))
Jack O'Connor

2
önceden tanımlanmış bir çağrılabilir olduğunda map(f, xs)(veya imappython2.x'te) tercih etme eğilimindeyim ; daha az bayt kodu çalıştırma eğilimindedir ve genellikle daha kompakttır. Kesinlikle do not çok daha kötü şu(f(x) for x in xs)f map(lambda x:..., xs)(... for x in xs)
SingleNegationElimination

1
@ user1767754: gerçekten mi? Bağlantı mı?
SingleNegationElimination

19

Bu basit bir koddur, bu nedenle yeniyseniz, yeterince kolay anlamalısınız.

    mylist = ["x", 3, "b"]
    for items in mylist:
        print(items)

İstediğiniz gibi hepsini tırnak işaretleri olmadan yazdırır.


15

Yalnızca yazdır kullanarak:

>>> l = ['x', 3, 'b']
>>> print(*l, sep='\n')
x
3
b
>>> print(*l, sep=', ')
x, 3, b


9

Kullanmak yerine, yineleyiciyi kabul mapetme özelliğine sahip bir oluşturucu ifadesi kullanmanızı öneririm join:

def get_nice_string(list_or_iterator):
    return "[" + ", ".join( str(x) for x in list_or_iterator) + "]"

Burada joinstring sınıfının bir üye fonksiyonudur str. Bir argüman alır: bir dizge listesi (veya yineleyici), daha sonra bu durumda, tarafından birleştirilmiş tüm öğelerin bulunduğu yeni bir dize döndürür ,.


2
Harita 2.x'te bir liste döndürdüğü için Python 2 için iyi bir optimizasyon. 3.x'te bir jeneratör döndürür, bu yüzden orada pek yardımcı olmaz.
Tom Zych

7
Dönüş ", ".join( str(x) for x in list_or_iterator).join('[]')
yapardım

@eyquem: Zekice, daha önce katılmanın böyle kullanıldığını görmemiştim. Yine de, bu yeni başlayanlar için biraz daha opaktır (çünkü bir dizenin tek karakterli dizelerden oluşan yinelenebilir bir kapsayıcı olduğu özelliğini kullandığınız için).
Seth Johnson

6

Bir dizedeki tüm istenmeyen karakterleri , argüman için olan translate()yöntemini ve ardından argümanı için kaldırılmasını istediğiniz karakter (ler) i içeren bir dizeyi kullanarak silebilirsiniz .Nonetabledeletechars

lst = ['x', 3, 'b']

print str(lst).translate(None, "'")

# [x, 3, b]

Eğer 2,6 önce Python bir sürümünü kullanıyorsanız, kullanmak gerekir stringmodülün translate()yeteneği geçmesine çünkü yerine işlevi Noneolarak tableargüman Python 2.6 kadar eklenmedi. Bunu kullanmak şuna benzer:

import string

print string.translate(str(lst), None, "'")

Bu string.translate()işlevi kullanmak 2.6+ sürümünde de çalışacaktır, bu nedenle işlevin kullanılması tercih edilebilir.


2
Ne yazık ki: lst = ["it isn't", 3, 'b']==> ["it isnt", 3, b]ve ayrıcalst = ['it isn\'t', 3, 'b']
eyquem

1
@eyquem: Evet, gerçekte verilerinizin bir parçası olan karakterlerin silinmesinden kaçınmak (kesinlikle sınırlandırmak için kullanmak yerine), eğer bir olasılıksa, doğal olarak biraz daha ayrıntılı / farklı bir mantık gerektirir.
martineau

3

İşte @ TokenMacGuy'un tek satırlık programındaki bazı adımları gösteren etkileşimli bir oturum. İlk olarak map, listedeki her bir öğeyi bir dizgeye dönüştürmek için işlevi kullanır (aslında, eski listedeki öğeleri dönüştürmez, yeni bir liste oluşturur). Sonra joinbu dizeleri ', 'aralarında birleştirmek için string yöntemini kullanıyor . Gerisi, oldukça basit olan dize biçimlendirmesidir. (Düzenleme: bu örnek basittir; genel olarak dize biçimlendirme biraz karmaşık olabilir.)

Kullanmanın join, birkaç alt dizeden bir dize oluşturmanın basit ve etkili bir yolu olduğunu, dizelere arka arkaya dizeler ekleyerek yapmaktan çok daha verimli olduğunu unutmayın; bu, arka planda çok sayıda kopyalama gerektirir.

>>> mylist = ['x', 3, 'b']
>>> m = map(str, mylist)
>>> m
['x', '3', 'b']
>>> j = ', '.join(m)
>>> j
'x, 3, b'

2

.formatDize biçimlendirmesi için kullanmak ,

mylist = ['x', 3, 'b']
print("[{0}]".format(', '.join(map(str, mylist))))

Çıktı:

[x, 3, b]

Açıklama:

  1. mapyazılacak listenin her bir öğesini eşlemek için kullanılır string.
  2. Öğeler, ,ayırıcı olarak bir dizede birleştirilir .
  3. Liste parantezlerini göstermek için print deyiminde [ve kullanırız ].

Referans: .formatPEP-3101 dizgi formatlaması için


Harika! .formatEn pitonik yolu kullanarak buluyorum . Ama tabii ki anlaşmazlıkları da kabul ediyorum. ;)
sevdim. Tarafından. İsa

0

@AniMenon'dan daha genel bir pitonik çözüm yazmak için ilham aldım.

mylist = ['x', 3, 'b']
print('[{}]'.format(', '.join(map('{}'.format, mylist))))

Sadece formatyöntemi kullanır . İz strbırakmaz ve öğelerin formatının ince ayarına izin verir. Örneğin, listenin öğeleri olarak kayan sayılarınız varsa, bu durumda bir dönüştürme belirticisi ekleyerek biçimlerini ayarlayabilirsiniz.:.2f

mylist = [1.8493849, -6.329323, 4000.21222111]
print("[{}]".format(', '.join(map('{:.2f}'.format, mylist))))

Çıktı oldukça iyi:

[1.85, -6.33, 4000.21]
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.