2013-02-22 15 views
5

Mam serię liczb:numery Formatowanie konsekwentnie w Pythonie

from numpy import r_ 
r_[10**(-9), 10**(-3), 3*10**(-3), 6*10**(-3), 9*10**(-3), 1.5*10**(-2)] 

i chciałbym mieć wyświetlane w legendzie działce w postaci:

a 10^(b) 

(z ^ czyli indeks górny)

dzięki czemu np. trzecia liczba staje się 3 10^(-3).

Wiem, że muszę użyć do tego celu operatora formatowania ciągów znaków Pythona %, ale nie widzę sposobu, aby to zrobić. Czy ktoś może mi pokazać, jak (lub pokazać mi alternatywny sposób)?

+0

możesz również spróbować str.format - http://docs.python.org/2/library/string.html#formatstrings – dmg

+0

W jaki sposób tworzysz fabułę? Czy jest to tylko jakaś grafika podobna do ASCII, czy używasz 'matplotlib' lub innych bibliotek? – Bakuriu

+0

czy ''% s 10^(% s) '% (numer1, numer2) 'działa? – dmg

Odpowiedz

6

Jeżeli jesteś pewien, że nie potrzebują więcej niż ustaloną liczbę miejsc po kropce dziesiętnej, a następnie:

>>> from numpy import r_ 
>>> a = r_[10**(-9), 10**(-3), 3*10**(-3), 6*10**(-3), 9*10**(-3), 1.5*10**(-2)] 
>>> for x in a: print "%.1e"%x 
... 
1.0e-09 
1.0e-03 
3.0e-03 
6.0e-03 
9.0e-03 
1.5e-02 

Połów jest to, że byli do korzystania %.0e jako format, ostatni Numer zostanie wydrukowany jako 1e-2

EDIT: Ponieważ używasz matplotlib, to już zupełnie inna historia: można użyć silnik renderowania tex. Szybkie i-brudny przykład:

fig = plt.figure() 
ax = fig.add_subplot(111) 

x = 1.5*10**(-2) 
l = ("%.0e"%x).split("e") 
x_str = r"$ %s \times 10^{%s}$" % (l[0], l[1]) 

ax.set_title(x_str) 

plt.show() 

które rzeczywiście być trochę czystsze z nowego formatowania .format strun.

EDIT2: Tylko dla kompletności i przyszłości, oto moje zdanie na drodze PO jest z uwagami:

x = 1.5*10**(-2) 
l = ("%.0e"%x).split("e") 
x_str = r"$%s \times 10^{%s}$" % (l[0], str(int(l[1]))) 

Tutaj jestem konwersji do int iz powrotem, aby uniknąć zer: -02 - >-2 itp

+0

Wierzę, że nie tego chciał. Nie widzę tutaj żadnego indeksu górnego. – Bakuriu

+0

Czy istnieje sposób, aby 1) umieścić wykładnik w indeksie górnym i 2) zamienić 'e' na' 10'? – rubenvb

+0

@rubenvb zobacz moją zredagowaną odpowiedź. –

0
list_item = (multiply_number,degree_number) 
displayed_items = [list_item, list_item, ....] 
for item in displayed_items: 
    print '{0}*10^({1})'.format(*item) 

Stwórz listę trójek z numeru, który chcesz wyświetlić. I po prostu wypisz je używając formatu(). Nie zapomnij użyć * (dotyczy to używania każdego elementu w krotce).