Справка по списку Python (увеличение количества, добавление)
Я пытаюсь соединить Google Geocode API и Github API, чтобы проанализировать местоположение пользователя и создать список из него.
Массив (список), который я хочу создать, выглядит так:
location, lat, lon, count
San Francisco, x, y, 4
Mumbai, x1, y1, 5
Если местоположение, широта и долгота анализируются из геокода Google, count - это вхождение этого местоположения. Каждый раз, когда добавляется новое местоположение: если оно существует в списке, счетчик увеличивается, в противном случае он добавляется в массив (список) с местоположением, lat, lon и счет должен быть 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, с которым я борюсь.
Может кто-нибудь мне помочь? Благодарю.
5 ответов
С 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})
Это лучше хранить в виде словаря, индексированного по названию города. Вы можете хранить его как два словаря, один словарь кортежей для широты / долготы (поскольку широта / долгота никогда не меняется):
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})
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
метод.
Это своего рода объединение всех других рекомендуемых идей:
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, который, как вы можете видеть, позволяет легко и то и другое:
- посчитать количество вхождений по городам
- сохранить пары широта / долгота нетронутыми
ВОЗВРАТ:
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')]})
В этом ответе делается (непроверенное) предположение о том, что гранулярность ваших лат / длинных пар вряд ли повторится, но на самом деле вас интересует только подсчет по городам.
Как насчет использования python dict? Вы можете прочитать о них здесь
http://docs.python.org/2/tutorial/datastructures.html
Вот пример реализации:
// Create an empty dictionary.
dat = {}
if dat.has_key(location):
dat[location] = dat[location] + 1
else:
dat[location] = 1