Python列表帮助(递增计数,追加)

时间:2013-04-23 14:40:55

标签: python arrays list

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

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

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

如果从Google地理编码解析了location,lat和lon,则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获取用户的位置,并且可以从谷歌获取地理编码数据。我只需要在python中创建这个数组,我正在努力。

任何人都可以帮助我吗?感谢。

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

计数的collections.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})

答案 2 :(得分: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方法中。

答案 3 :(得分: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. 保持lat / lon对完整
  3. 返回值:

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

    这个答案是(未经证实的)假设你的纬度/经度对的粒度不太可能重复,但实际上你只对按城市进行计数感兴趣。

答案 4 :(得分: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