2016-03-20 19 views
1

"Tablo" girdisi, dizelerin listelerinin bir listesidir, hedef oluşturulur ve 2B tablosunu temsil eden biçimlendirilmiş
dizgisini döndürür.Dize formatı kullanın 2B liste oluştur

  • 2B tablosunun her satırı ayrı bir satırdadır; Son satırı boş bir satır
  • izler. Her sütun sola hizalanır;
  • Sütunlar tek bir dikey çubukla ayrılır '|'; ve dikey çubuktan önce ve sonra tam olarak bir boşluk olmalıdır;
  • Her satır başlar ve bir dikey çubukla sona erer; ve orada lider bar sonra tam olarak bir boşluk olmalı ve bitiş çubuğu İşte

önce ne var gerekir: satırlara boşluk eşit olduğunda

def show_table(table): 
    new_string = '' 
    for i in table: 
     for j in range(len(i)): 
      line = i[j] 
      new_string += '| {} '.format(i[j]) 
     new_string += '|\n' 

    return new_string 

Benim kod bazı durumlarda çalışır. Örneğin:

Ancak
input: [['A','BB'],['C','DD']] 
output: '| A | BB |\n| C | DD |\n' 
print:| A | BB | 
     | C | DD | 

, satırlar gibi benzer olmadığında:

input: [['10','2','300'],['4000','50','60'],['7','800','90000']] 

Benim çıkış farklılık neden olur:

Right_output: '| 10 | 2 | 300 |\n| 4000 | 50 | 60 |\n| 7 | 800 | 90000 |\n' 
my_output: '| 10 | 2 | 300 |\n| 4000 | 50 | 60 |\n| 7 | 800 | 90000 |\n' 

Ve sağ çıktı gerektiği düzgün benziyor:

| 10 | 2 | 300 | 
| 4000 | 50 | 60 | 
| 7 | 800 | 90000 | 

my çıkışı: Ben çıktısını maç sağ çıktı yapmak için kodumu niteleyici gerekiyor

| 10 | 2 | 300 | 
| 4000 | 50 | 60 | 
| 7 | 800 | 90000 | 

? Sanırım sütunların maksimum genişliği ile ilgili bir şey var mı?

+0

AFAICS, çıktılarınız istenen çıktıyı karşılamadığında gereksinimleri karşılar (bazı dikey çubuklardan önce birden fazla alan yoktur). Şimdi eğer hala diğer çıkışı istiyorsan evet, her bir sütunun genişliğini hesaplaman gerek, sonra her bir diziyi formatlarken onu kullan. Bu, girişten iki kez geçerek yürümek anlamına gelmez. – Goyo

cevap

1

(sola hizalayarak) str.format() ile padding bir dize sözdizimi şu şekildedir: Masaya yazdırmadan önce sütunların genişliklerini ön hesaplama gerekir

>>> '{:10}'.format('test') 
'test  ' 

. Bu hak çıktıyı üretir:

def show_table(table): 
    new_string = '' 

    widths = [max([len(col) for col in cols]) for cols in zip(*table)] 

    for i in table: 
     for j in range(len(i)): 
      new_string += '| {:{}} '.format(i[j], widths[j]) 
     new_string += '|\n' 

    return new_string 
+0

Çok teşekkür ederim, kodunuz tamamen mantıklı. Küçük hata new_string + = '| {{:> {}}} .format (genişlik [j]) biçimi (i [j]). Sanırım '>' her bir sütunu sağa hizalar. Bunu "<" olarak değiştirdim ve kodumun tüm test senaryolarını geçmesini sağlıyor. Çok teşekkürler! ;) – markzzzz

+0

@markzzzz: Sağ, '>' sağa hizalar. Sola hizalamak için onu atlayabilirsiniz (yayını güncelledim). –

1

İstenen çıktıyı elde etmek için, senin fonksiyonu içine tablo elemanlarının maksimum genişliğini entegre: ...

def show_table(table): 
    max_widths = map(max, map(lambda x: map(len, x), zip(*table))) 
    new_string = '' 
    for i in table: 
     for j in range(len(i)): 
      line = i[j] 
      line = line + ' '*(max_widths[j]-len(line)) 
      new_string += '| {} '.format(line) 
     new_string += '|\n' 

    return new_string 

max_widths hattını açıklamak için

max_widths = map(max, map(lambda x: map(len, x), zip(*table))) 

...o 3 adımda yapılabilir: masanın

transposed = zip(*table) 
  • ait

    1. Devrik satırlar ve sütunlar karşılaştırmayı

      lengths = map(lambda x: map(len, x), transposed) 
      
    2. maksimum alın izin tüm dizeleri uzunlukları alın sütun başına uzunluk

      max_widths = map(max, lengths)