我正在尝试使用collections.counter方法来计算每个键的值的数量。因此,当我迭代我的数据库时,我希望它能够计算找到值的次数。相反,它只是在每次DB发生时打印一个值。这是我使用的函数的代码:
def clusters(tweetLocation):
cityCount=None
cities = {"London":[51.50722, -0.12750], "New York":[-74.006605 ,40.714623]}
for k,v in cities.items():
if distance.distance(v, tweetLocation).miles < 50:
cityCount=k
else:
pass
return cityCount
脚本代码:
city_counter=[]
while cursor.alive:#cursor reads all relevant values from the DB
try:
doc = cursor.next()
if not doc['coordinates']:
placeName = doc['place']['full_name']
loc = g.geocode(placeName)
time.sleep(0.15)
city_counter=Counter([clusters([loc])])
else:
places = doc['coordinates']['coordinates']
city_counter=Counter([clusters([places])])
except (ValueError, geocoders.google.GQueryError):
pass
except StopIteration:
break
print city_counter
而是返回类似的内容:
Counter({New York: 25, London: 15})
我明白了:
Counter({None: 1})
Counter({None: 1})
Counter({New York: 1})
Counter({None: 1})
......
我之前从未使用过collections.counter,但我认为它会返回值的总和。
由于
答案 0 :(得分:1)
当你致电Counter()
时,你会创建一个反对象。要添加它,请使用其update()
方法。看起来你可能想要创建一个存储在city_counter
中的Counter对象,然后在你的循环调用中city_counter.update([clusters([loc])])
有关详细信息,请参阅the documentation
答案 1 :(得分:1)
问题是你每次都在创建一个新的Counter
,所以每次都会返回一个新的Counter
。你有三个选择:
Counter
基本上,这将涉及您立即获取整个城市列表,然后通过cities = []
while cursor.alive:
try:
cities.append(cursor.next())
except StopIteration:
break
print collections.Counter(cities.keys())
推送它。
Counter
doc
Counter
为此,您所要做的就是确保首先创建update
,然后使用city_counter = collections.Counter()
while cursor.alive:
city_counter.update([clusters[places]])
# etc.
方法。
defaultdict
city_counter = collections.defaultdict(int)
while cursor.alive:
city_counter[clusters[places]] += 1
# etc.
根据您的情况,这可能是最佳选择。
{{1}}