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

Python列表帮助(递增计数、追加),python,arrays,list,Python,Arrays,List,我正在尝试连接谷歌的地理编码api和github api来解析用户的位置,并从中创建一个列表 我要创建的数组(列表)如下所示: location, lat, lon, count San Francisco, x, y, 4 Mumbai, x1, y1, 5 如果位置、纬度和经度是从谷歌地理编码中解析出来的,那么count就是该位置的出现次数。每次添加新位置时:如果列表中存在该位置,则计数将递增,否则将使用位置、纬度、经度将其追加到数组(列表)中,且计数应为1 另一个例子: location

我正在尝试连接谷歌的地理编码api和github api来解析用户的位置,并从中创建一个列表

我要创建的数组(列表)如下所示:

location, lat, lon, count
San Francisco, x, y, 4
Mumbai, x1, y1, 5
如果位置、纬度和经度是从谷歌地理编码中解析出来的,那么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创建这个数组,我正在努力解决这个问题


有人能帮我吗?谢谢。

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

以及计数的
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})
导入集合
城市计数=collections.defaultdict(int)
城市计数[“旧金山”]+=1
城市计数[“孟买”]+=1
城市计数[“旧金山”]+=1
#城市计数将是
#defaultdict(,{'San Francisco':2,'Mumbai':1})

使用python dict怎么样?你可以在这里读到他们

下面是一个示例实现:

// Create an empty dictionary.
dat = {}

if dat.has_key(location):
    dat[location] = dat[location] + 1
else:
    dat[location] = 1

Python有一个预烘焙类,专门用于计算事件的发生率:它被称为。如果您可以生成一个迭代器,从输入数据(可能带有生成器表达式)中生成连续元组
(city、lat、lon)
,只需将其传递到
计数器
即可直接获得所需内容。例如

>>> 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
方法中。

使用
集合。计数器可以执行以下操作:

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

这是所有其他建议想法的一种融合:

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,正如您所看到的,它允许以一种简单的方式同时执行以下两个操作:

  • 按城市统计发生的次数
  • 保持lat/lon对完好
  • 返回:

    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')]})
    
    defaultdict(,{'Miami':1,'旧金山]:2,'开罗]:1,'孟买]:1})
    defaultdict(,{'Miami':[('x2','y2')],'SanFrancisco':[('x','y'),('x4','y4')],'Cairo':[('x3','y3')],'Mumbai':[('x1','y1')])
    

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

    我建议使用字典(
    dict
    )。如果你想用csv模块打印列表,检查答案的方式与DICT是LAT /长直接相关的位置,例如,所有旧金山的位置都有相同的LAT /长?如果不是的话,你也需要额外的结构来保持数据的完整性。我该如何将lat和lon添加到这个dict中?也许我做错了什么。我的输出是test:{u'sanfrancisco,CA,USA':'-122.4194155,37.7749295'}-defaultdict({u'sanfrancisco,CA,USA':1})#计数应为4。最好在键中包含lat和long(以区分巴黎、法国和巴黎、得克萨斯…),因此应该使用元组(city、lat、long)作为键集合。计数器比默认DICT更好,它是专门为。。。计数!:-)还有,@thierrylahuille说的话。@thierrylahuille我喜欢你说的话,但我不知道如何用python来做。你能告诉我一个网址或更新你的答案吗?谢谢。对于单个条目,
    .update()
    相当冗长。您也可以直接添加到计数器:
    c['Mumbai',1,2]+=1
    。谢谢Martijn,这更干净了!
    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')]})