2

郵便番号、lat、lngに基づいて特定の数式を計算するプログラムを作成しようとしています。

私の最初のアイデアは、郵便番号ごとにオブジェクトを作成することでした。

class destination():
def __init__(self, zipcode, count):
    self.zipcode = zipcode
    self.count = count

def getCount(self):
    return self.count

def getZip(self):
    return self.zipcode

def getLatitude(self):
    return self.lat 

def getLongitude(self):
    return self.lng 

def __str__(self):
    return "%s at %s , %s" % (self.zipcode, self.lat, self.lng)

def getCoords(self):
    '''
    Must be called before getLatitude or get Longitude
    '''
    self.place, (self.lat, self.lng) = gn.geocode(str(self.zipcode))  
    self.city = self.place.split(",",1)
    self.name =  self.city[0]
    self.value = str(count)+","+self.name

    return self.value

リストを繰り返し処理してオブジェクトを作成し、iから必要な情報を抽出できるので、これは問題なく機能します。

zipList = ['54971','46383','90210']

for i in zipList:
    i = destination(i,count)
        count += 1

戻ります

1,Ripon
-88.8359447
43.8422049
2,Valparaiso
-87.0611412
41.4730948
3,Beverly Hills
-118.4003563
34.0736204

私が頭を悩ませているように思えないのは、各項目の正しい情報を使用して、haversine関数を呼び出すリストを反復処理するようにプログラムを設定する方法です。

def haversine(latStart,lonStart,latEnd,lonEnd):

例:私のリストが

zipList = ['54971','46383','90210']

次に、54971から46383、54971から90210、および46383から90210の計算を実行します。

4

4 に答える 4

4

リストから郵便番号のすべてのペアを要求し、それらを使用します。

import itertools

for start, stop in itertools.combinations(zipList, 2):
    print start, stop
    # now pass start, stop to your function
于 2013-01-24T23:44:24.517 に答える
3

itertoolsを使用してみてください。組み合わせ関数が必要な場合があります。

于 2013-01-24T23:42:14.017 に答える
0

宛先オブジェクトのリストを作成し、作成されたリストの組み合わせを取得して、haversine関数を介して返されたジェネレーターを反復処理できます。

dests = []
for i in zipList:
    dests.append(destination(i,count))
    count += 1

dests_gen = itertools.combinations(dests, 2)
for dest_typle in dests_gen:
    pass
于 2013-01-24T23:50:20.127 に答える
0

短い答え:

for a, b in ( (a, b) for a in zipList for b in zipList):
    print (a, b, distance (a, b) )

コメント:クラス変数にする場合は、「カウント」を手動で制御する必要はありません。プロパティを使用して、ポイントをオンデマンドでジオロケーションできます(つまり、latまたはlonに最初にアクセスしたとき)。プロパティがパブリックである場合(APIで必要な場合を除く)、getterメソッドは実際には必要ありません。多分このようなもの。

#! /usr/bin/python3.2

def haversine (latStart,lonStart,latEnd,lonEnd): return 42

class Destination():
    count = 0

    def __init__(self, zipcode):
        self.zipcode = zipcode
        self.count = self.__class__.count
        self.__class__.count += 1
        self.__coords = None

    @property
    def latitude (self):
        if not self.__coords: self.__locate ()
        return self.__coords [0]

    @property
    def longitude (self):
        if not self.__coords: self.__locate ()
        return self.__coords [1]

    def __str__(self):
        return "%s at %s , %s" % (self.zipcode, self.latitude, self.longitude)

    def __locate (self):
        '''
        Will be called automatically before getLatitude or get Longitude
        '''
        self.place, self.__coords = gn.geocode (str (self.zipcode) )  
        self.city = self.place.split (",",1)
        self.name =  self.city [0]

    def distance (self, other):
        return haversine (self.latitude, self.longitude, other.latitude, other.longitude)
于 2013-01-25T00:05:08.920 に答える