收集计数器不总计总值

时间:2012-12-03 17:08:52

标签: python python-2.7

我正在尝试使用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,但我认为它会返回值的总和。

由于

2 个答案:

答案 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}}