Mam ten kod (wypisuje wystąpienie wszystkich permutacji w ciągu)
def splitter(str):
for i in range(1, len(str)):
start = str[0:i]
end = str[i:]
yield (start, end)
for split in splitter(end):
result = [start]
result.extend(split)
yield result
el =[];
string = "abcd"
for b in splitter("abcd"):
el.extend(b);
unique = sorted(set(el));
for prefix in unique:
if prefix != "":
print "value " , prefix , "- num of occurrences = " , string.count(str(prefix));
Chcę wydrukować całe wystąpienie permutacji w zmiennej łańcuchowej.
ponieważ permutacja nie jest tej samej długości, chcę poprawić szerokość i wydrukować ją w ładnym, innym niż ten:
value a - num of occurrences = 1
value ab - num of occurrences = 1
value abc - num of occurrences = 1
value b - num of occurrences = 1
value bc - num of occurrences = 1
value bcd - num of occurrences = 1
value c - num of occurrences = 1
value cd - num of occurrences = 1
value d - num of occurrences = 1
Jak mogę format
to zrobić?
Znalazłem te posty, ale nie pasowały do ciągów alfanumerycznych:
python
python-2.7
format
0x90
źródło
źródło
"\t"
nie jest wymieniony jako opcja w żadnym rozwiązaniu.Odpowiedzi:
EDYCJA 2013-12-11 - Ta odpowiedź jest bardzo stara. Nadal jest poprawny i poprawny, ale osoby, które się tym zajmują, powinny preferować nową składnię formatu .
Możesz użyć formatowania ciągów w następujący sposób:
Gruntownie:
%
informuje charakter Python będzie musiał coś zastępczego tokens
informuje znaków python tokena będzie ciągiem5
(lub cokolwiek numer chcesz) informuje pyton pad napis spacjami do 5 znaków.W Twoim konkretnym przypadku możliwa implementacja może wyglądać następująco:
UWAGA BOCZNA: Po prostu zastanawiałem się, czy wiesz o istnieniu
itertools
modułu . Na przykład możesz uzyskać listę wszystkich swoich kombinacji w jednym wierszu z:i możesz uzyskać liczbę wystąpień, używając
combinations
w połączeniu zcount()
.źródło
Uważam, że użycie
str.format
znacznie bardziej eleganckiego:Jeśli chcesz wyrównać ciąg do prawej strony,
>
zamiast<
:Edycja: jak wspomniano w komentarzach: 0 wskazuje indeks argumentu przekazany do
str.format()
.źródło
'{<5}'.format('ss')
'ss '
tak jak poprzednio, ale bez 0, robi to samo lub'Second {1: <5} and first {0: <5}'.format('ss', 'sss')
'Second sss and first ss '
możesz zmienić kolejność lub nawet wyprowadzić tę samą zmienną wiele razy w jednym wyjściu strunowy.{<5}
nie działa, ale{: <5}
działa bez wartości indeksu.{0: <5}
to[fill]
,<
jest[align]
i5
jest[width]
>>> print width 20 >>> print "{0: <{width}}".format("ssssss", width=width).split('\n') ['ssssss '] >>>
width=10; "{0: <{1}}".format('sss', width)
. Lub nawet pomiń liczby'{: <{}}'.format('sss', width)
Pierwotnie opublikowany jako zmiana odpowiedzi @ 0x90, ale został odrzucony za odbieganie od pierwotnego zamysłu postu i zalecany jako komentarz lub odpowiedź, więc dołączam tutaj krótki opis.
Oprócz odpowiedzi z @ 0x90, składnię można uelastycznić, używając zmiennej dla szerokości (zgodnie z komentarzem @ user2763554):
Co więcej, możesz skrócić to wyrażenie, używając tylko liczb i polegając na kolejności argumentów przekazywanych do
format
:Lub nawet pomiń wszystkie liczby, aby uzyskać maksymalną, potencjalnie niejawną w Pythonie zwartość:
Aktualizacja 2017-05-26
Wraz z wprowadzeniem sformatowanych literałów łańcuchowych (w skrócie „f-strings”) w Pythonie 3.6, jest teraz możliwy dostęp do wcześniej zdefiniowanych zmiennych przy użyciu krótszej składni:
Dotyczy to również formatowania ciągów
źródło
format
jest zdecydowanie najbardziej eleganckim sposobem, ale afaik, nie możesz tego użyć zlogging
modułem Pythona , więc oto jak możesz to zrobić używając%
formatowania:W tym przypadku
-
symbol wskazuje wyrównanie do lewej, a liczba przeds
wskazuje stałą szerokość.Niektóre przykładowe dane wyjściowe:
Więcej informacji w dokumentach tutaj: https://docs.python.org/2/library/stdtypes.html#string-formatting-operations
źródło
'%(name)20.20s'
który ustawia 20 zarówno jako minimalną, jak i maksymalną długość łańcucha!źródło