Filele din imprimare nu sunt consistente python (Programare, Python, String)

ewan a intrebat.

Vreau să am tab-uri reale într-un print, dar t pune doar spații.De ex:

 first:ThisIsLong         second:Short
 first:Short         second:ThisIsLong
 first:ThisIsEvenLonger         second:Short

Cum aș putea să o rezolv astfel încât să am toate primele și toate secundele aliniate. De ex:

 first:ThisIsLong         second:Short
 first:Short              second:ThisIsLong
 first:ThisIsEvenLonger   second:Short

Comentarii

  • Îmi pare rău, nu sunt nou aici, încă mă obișnuiesc cu stack overflow…  > Por ewan.
  • Genul de lucru pe care îl arătați este genul de lucru la care vă așteptați cu tabulatoare reale –  > Por John Coleman.
  • Tab-urile reale se fixează într-un punct –  > Por ewan.
  • Dar… nu întotdeauna la punctul la care te aștepți. Vedeți răspunsul meu. –  > Por John Coleman.
5 răspunsuri
mjwunderlich

Puteți folosi formatarea pentru a alinia șirurile în schimb. De exemplu, îi puteți spune lui python că prima coloană ar trebui să aibă 20 de caractere, iar a doua ar trebui să aibă 10, aliniate la stânga.

De exemplu:

string_one = 'first:ThisIsLong'
string_two = 'second:Short'

print( '{:<20s} {:<10s}'.format(string_one, string_two) )

va imprima:

first:ThisIsLong     second:Short

Primul descriptor de formatare ({:<20s}) de aici spune:

'<' aliniere la stânga, 20 cel puțin 20 de caractere, s deoarece este un șir de caractere

Comentarii

  • cum aș putea face acest lucru dacă șirul unu nu este întotdeauna același –  > Por ewan.
  • @ewan, dacă aveți o estimare rezonabilă a celui mai lung șir de caractere, atunci introduceți acest număr în descriptorul de format. {:<100s} în caz contrar, va trebui să vă dați seama de lungimea maximă a șirului și să o utilizați –  > Por mjwunderlich.
  • sfat: puteți formata un descriptor de format pentru a adăuga lungimea în mod dinamic: '{:<%ds}' % 100 va ieși {:<100s} –  > Por mjwunderlich.
falsetru

În loc să folosiți tab-ul (t), vă sugerez să folosiți formatarea șirurilor de caractere folosind formatarea în stil printf sau str.format:

rows = [
    ['first:ThisIsLong', 'second:Short'],
    ['first:Short', 'second:ThisIsLong'],
    ['first:ThisIsEvenLonger', 'second:Short'],
]
for first, second in rows:
    print('%-25s %s' % (first, second))

sau

print('{:<25} {}'.format(first, second))

John Coleman

Python print trimite șiruri de caractere la ieșirea standard. Ceea ce face ieșirea standard cu aceste șiruri depinde de dispozitivul de ieșire. Interpretarea implicită a t este de a trece la următoarea oprire de tabulare, care, prin convenție, este poziția caracterului care este următorul multiplu de 8 după poziția în care t apare (numărând pozițiile de caractere de la stânga începând cu 0).

De exemplu, dacă execut:

babynames = [('kangaroo', 'joey'), ('fox', 'kit'), ('goose','gosling')]
for x,y in babynames: print(x + 't' + y)

obțin:

kangaroo        joey
fox     kit
goose   gosling

Am obținut cele de mai sus în IDLE. kangaroo ocupă coloanele 0-7. t se află în coloana 8, deci următorul multiplu de 8 (următoarea oprire de tabulare) după tabularea este în coloana 16 – care este, într-adevăr, locul unde vedeți joey. În următoarele două rânduri — următoarea oprire de tabulare după primul cuvânt se află în coloana 8. Acest lucru arată că (cel puțin în shell-ul IDLE) Python este folosește tabulatoare reale.

Tab-urile în acest sens sunt oarecum enervante. Ele pot fi folosite pentru a alinia date de tip șir de caractere de lungime variabilă doar cu o anumită dificultate enervantă. După cum au indicat și alții, soluția este să nu folosiți tabulatoare, ci să folosiți în schimb format

Comentarii

  • Tocmai am testat-o și t pentru mine adaugă doar 8 spații –  > Por ewan.
  • de fapt, îmi pare rău că funcționează, dar pentru ceea ce folosesc eu nu funcționează.  > Por ewan.
  • @ewan Unele IDE-uri au o opțiune care convertește automat tabulatoarele în spații, poate că este activată în mod implicit. Acest lucru ar putea fi ceea ce vedeți. Diferite editoare/shell-uri se ocupă de t în mod diferit. Nu prea are legătură cu Python în sine. Verificați opțiunile editorului în ceea ce folosiți. –  > Por John Coleman.
unutbu

Calculați lățimea maximă necesară pentru fiecare coloană și apoi utilizați formatarea șirurilor de caractere pentru a compune un format care specifică lățimea dorită:

data = [['first:ThisIsLong', 'second:Short'],
        ['first:Short', 'second:ThisIsLong'],
        ['first:ThisIsEvenLonger', 'second:Short']]

widths = [max([len(item) for item in col]) for col in zip(*data)]
fmt = ''.join(['{{:{}}}'.format(width+4) for width in widths])
for row in data:
    print(fmt.format(*row))

randamente

first:ThisIsLong          second:Short         
first:Short               second:ThisIsLong    
first:ThisIsEvenLonger    second:Short         

Stevo

Cel mai pythonic mod de a face acest lucru este:

string_one = 'first:ThisIsLong'
string_two = 'second:Short'

print(f'{string_one:<20s} {string_two:<10s}')

În schimb, puteți folosi un șir F (format string) pentru a alinia șirurile. De exemplu, îi puteți spune lui python că prima coloană trebuie să aibă 20 de caractere, iar a doua 10, aliniate la stânga.

folosind acest F-string se va imprima:

first:ThisIsLong     second:Short

Broken Down

f'{insert_variable_here:<20s}' spune:

: ia tot ce este înainte de acest lucru și formatează ca: < left align, 20 cel puțin 20 de caractere, s pentru că este un șir de caractere.

Meritul lui mjwunderlich pentru format.