2

Google のジオコード API と github API を接続して、ユーザーの場所を解析し、そこからリストを作成しようとしています。

作成したい配列(リスト)はこんな感じです。

location, lat, lon, count
San Francisco, x, y, 4
Mumbai, x1, y1, 5

位置、緯度、経度が Google ジオコードから解析される場合、count はその位置の出現です。新しい場所が追加されるたびに: リストに存在する場合はカウントがインクリメントされます。それ以外の場合は、場所、緯度、経度とともに配列 (リスト) に追加され、カウントは 1 になります。

もう一つの例:

location, lat, lon, count
Miami x2, y2, 1 #first occurrence
San Francisco, x, y, 4 #occurred 4 times already
Mumbai, x1, y1, 5 #occurred 5 times already
Cairo, x3, y3, 1 #first occurrence

既に github からユーザーの位置を取得でき、Google からジオコーディングされたデータを取得できます。苦労しているPythonでこの配列を作成するだけです。

誰でも私を助けることができますか?ありがとう。

4

5 に答える 5

4

を使用collections.Counterすると、次のことができます。

from collections import Counter

# initial values
c=Counter({("Mumbai", 1, 2):5, ("San Francisco", 3,4): 4})

#adding entries
c.update([('Mumbai', 1, 2)])
print c  # Counter({('Mumbai', 1, 2): 6, ('San Francisco', 3, 4): 4})

c.update([('Mumbai', 1, 2), ("San Diego", 5,6)])
print c  #Counter({('Mumbai', 1, 2): 7, ('San Francisco', 3, 4): 4, ('San Diego', 5, 6): 1})
于 2013-04-23T14:57:32.170 に答える
2

これは、都市名で索引付けされた辞書として保存する方が適切です。緯度/経度のタプルの 1 つのディクショナリである 2 つのディクショナリとして保存できます (緯度/経度は決して変化しないため)。

lat_long_dict = {}
lat_long_dict["San Francisco"] = (x, y)
lat_long_dict["Mumbai"] = (x1, y1)

そして、collections.defaultdict常に 0 から始まるように、カウントに a を使用します。

import collections
city_counts = collections.defaultdict(int)

city_counts["San Francisco"] += 1
city_counts["Mumbai"] += 1
city_counts["San Francisco"] += 1
# city counts would be
# defaultdict(<type 'int'>, {'San Francisco': 2, 'Mumbai': 1})
于 2013-04-23T14:46:02.740 に答える
1

Python には、物事の発生をカウントするための事前に作成されたクラスがありcollections.Counterます。(city, lat, lon)入力データから (おそらくジェネレーター式を使用して)連続するタプルを生成するイテレーターを生成できる場合は、単にそれを に渡すだけで、Counter探しているものが直接得られます。例えば、

>>> locations = [('Miami', 1, 1), ('San Francisco', 2, 2), ('Mumbai', 3, 3), ('Miami', 1, 1), ('Miami', 1, 1)]
>>> Counter(locations)
Counter({('Miami', 1, 1): 3, ('San Francisco', 2, 2): 1, ('Mumbai', 3, 3): 1})

バッチ処理ではなく、プログラムの実行時にさらに場所を追加できるようにする必要がある場合は、関連するタプルをその Counter のupdateメソッドに入れます。

于 2013-04-23T14:50:32.493 に答える
1

これは、他のすべての推奨されるアイデアの一種です。

from collections import defaultdict

inputdata = [('Miami', 'x2', 'y2'),
             ('San Francisco', 'x', 'y'),
             ('San Francisco', 'x4', 'y4'),
             ('Mumbai', 'x1', 'y1'),
             ('Cairo', 'x3', 'y3')]

counts, coords = defaultdict(int), defaultdict(list)

for location, lat, lon in inputdata:
    coords[location].append((lat,lon))
    counts[location] += 1

print counts, coords

これは defaultdict を使用します。これにより、ご覧のとおり、両方を簡単に実行できます。

  1. 都市ごとに出現回数を数えます
  2. 緯度/経度のペアをそのまま維持

戻り値:

defaultdict(<type 'int'>, {'Miami': 1, 'San Francisco': 2, 'Cairo': 1, 'Mumbai': 1}) 
defaultdict(<type 'list'>, {'Miami': [('x2', 'y2')], 'San Francisco': [('x', 'y'), ('x4', 'y4')], 'Cairo': [('x3', 'y3')], 'Mumbai': [('x1', 'y1')]})

この回答は、緯度/経度のペアの粒度が繰り返される可能性は低いという(未検証の)仮定を立てていますが、実際には、都市ごとにカウントすることにのみ関心があります。

于 2013-04-23T15:15:45.663 に答える
0

python dict を使用するのはどうですか?ここでそれらについて読むことができます

http://docs.python.org/2/tutorial/datastructures.html#dictionaries

実装例を次に示します。

// Create an empty dictionary.
dat = {}

if dat.has_key(location):
    dat[location] = dat[location] + 1
else:
    dat[location] = 1
于 2013-04-23T14:48:20.547 に答える