2010-07-18 4 views

Antwort

15

Ich habe das schon mal gemacht. Die einfachste Lösung, die ich mit am Ende war eine Anordnung der folgenden Schlüssel/Wert:

120:Cap, 218:Aqu, 320:Pis, 420:Ari, 521:Tau, 
621:Gem, 722:Can, 823:Leo, 923:Vir, 1023:Lib 
1122:Sco, 1222:Sag, 1231: Cap 

Dann Sie das Geburtsdatum im mdd Format zu schreiben, dh Monat Nummer (mit 1 ab Januar) und zweistellige Tagesnummer (01-31). Iterieren durch das Array, und wenn das Datum kleiner oder gleich einem Element im Array ist, haben Sie Ihr Sternzeichen.

EDIT Ich brauchte diese hier ist also dieses Konzept als Arbeitsfunktion

zodiacs = [(120, 'Cap'), (218, 'Aqu'), (320, 'Pis'), (420, 'Ari'), (521, 'Tau'), 
      (621, 'Gem'), (722, 'Can'), (823, 'Leo'), (923, 'Vir'), (1023, 'Lib'), 
      (1122, 'Sco'), (1222, 'Sag'), (1231, 'Cap')] 
def get_zodiac_of_date(date): 
    date_number = int("".join((str(date.date().month), '%02d' % date.date().day))) 
    for z in zodiacs: 
     if date_number <= z[0]: 
      return z[1] 
+2

+1 - das sieht nach der besten Lösung aus, die ohne ein neues Modul installiert werden kann. –

+0

Ein 'Array' oder ein' Dict'? – Johnsyweb

+0

Ich würde ein Diktat dafür verwenden. – Daenyth

8

Sie könnten ihnen mehr Informationen über position of the planets und die Sterne geben.

import ephem 
>>> u = ephem.Uranus() 
>>> u.compute('1871/3/13') 
>>> print u.ra, u.dec, u.mag 
7:38:06.27 22:04:47.4 5.46 
>>> print ephem.constellation(u) 
('Gem', 'Gemini') 
+3

In einer perfekten Welt würden Sie die 'ephem' Bibliothek nutzen können finde das Sternzeichen heraus, indem du in deinem Beispiel einfach Uranus durch Sonne ersetzt. Es scheint jedoch, dass die Zeichen und die Konstellationen [nicht genau übereinstimmen] (http://en.wikipedia.org/wiki/Zodiac#Table_of_dates). Es gibt auch eine Astrologie-spezifische Python-Bibliothek namens [oroboros] (http://pypi.python.org/pypi/oroboros/20080712), aber es ist wahrscheinlich übertrieben. –

+1

'oroboros' verwendet' ephem'. – fmark

7

Mit bisect effizienter ist, als bis Sie Iterieren ein Spiel finden, aber eine Nachschlagtabelle für jeden Tag des Jahres schneller noch und wirklich nicht so groß.

from bisect import bisect 
signs = [(1,20,"Cap"), (2,18,"Aqu"), (3,20,"Pis"), (4,20,"Ari"), 
     (5,21,"Tau"), (6,21,"Gem"), (7,22,"Can"), (8,23,"Leo"), 
     (9,23,"Vir"), (10,23,"Lib"), (11,22,"Sco"), (12,22,"Sag"), 
     (12,31,"Cap")] 
def zodiac_sign(m,d): 
    return signs[bisect(signs,(m,d))][2] 

assert zodiac_sign(3,9) == "Pis" 
assert zodiac_sign(6,30) == "Can" 
2
var ZZ=[1231,1222,1122,1023,923,823,722,621,521,420,321,220,121]; 

var ZN=['Capricorn','Sagittarius','Scorpio','Libra','Virgo','Leo','Cancer', 'Gemini','Taurus','Aries','Pisces','Aquarius','Capricorn']; 

var d8=new Date(); 

var m=d8.getMonth()+1; 

var d=d8.getDate(); 

//m=1;d=1 

var mdd=parseInt(''+m+(d<9?'0'+d:d)); 

var i=0;while(ZZ[i]&gt;mdd && i&lt;ZZ.length){i++}--i; 

var RV='Born '+m+'/'+d+' - Star Sign: '+ZN[i];RV 
0

Heres meiner algo ohne eine Schleife (JS Logik: mit einem js Objekt) mit

var zods = { 
      0:{limit:21,vals:["aqu","cap"]}, 
      1:{limit:20,vals:["pis","aqu"]}, 
      2:{limit:21,vals:["ari","pis"]}, 
      3:{limit:21,vals:["tau","ari"]}, 
      4:{limit:21,vals:["gem","tau"]}, 
      5:{limit:21,vals:["can","gem"]}, 
      6:{limit:22,vals:["leo","can"]}, 
      7:{limit:22,vals:["vir","leo"]}, 
      8:{limit:22,vals:["lib","vir"]}, 
      9:{limit:22,vals:["sco","lib"]}, 
      10:{limit:23,vals:["sag","sco"]}, 
      11:{limit:22,vals:["cap","sag"]} 
      }; 

     var dt = new Date(); 
     var zodObj = zods[dt.getMonth()]; 
     return dt.getDate()>=zodObj.limit?zodObj.vals[0]:zodObj.vals[1]; 
Verwandte Themen