2

我正在尝试连接 google 的 geocode api 和 github api 来解析用户的位置并从中创建一个列表。

我要创建的数组(列表)是这样的:

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

从谷歌地理编码中解析位置、纬度和经度,计数是该位置的出现。每次添加新位置时:如果它存在于列表中,则计数增加,否则将其附加到具有位置、纬度、经度的数组(列表),并且计数应为 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

这将更好地存储为字典,按城市名称索引。您可以将其存储为两个字典,一个用于纬度/经度的元组字典(因为纬度/经度永远不会改变):

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

和 acollections.defaultdict用于计数,因此它始终从 0 开始:

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})

如果您需要能够在程序运行时添加更多位置而不是批处理它们,请将相关元组放入该计数器的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 回答