0

我正在尝试使用 collections.counter 方法来计算每个键的值的数量。因此,当我遍历我的数据库时,我希望它保持对找到值的次数的计数。相反,它每次出现在数据库中时都会打印一个值。这是我使用的函数的代码:

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,但我认为它会返回值的总和。

谢谢

4

2 回答 2

1

当您调用时,Counter()您会创建一个计数器对象。要添加它,请使用它的update()方法。看起来您可能想要创建一个存储在中的 Counter 对象city_counter,然后在您的循环调用中city_counter.update([clusters([loc])])

有关更多信息,请参阅文档

于 2012-12-03T17:16:57.857 回答
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.
于 2012-12-03T17:17:47.173 回答