2013-08-31 50 views
0

我想查找多维数组中的tags的数量。我不喜欢这样写道:Python字典加入值/优化

l['users']是我的数据(阵列)

tags = {} 
for u in l['users']: 
    for p in u['photos']: 
     for t in p['tags']: 
      if tags.get(t): 
       tags[t] +=1 
      else: 
       tags[t] = 1 

是否有任何清洁剂或编写代码更快的方法?

+0

您可以用修真缩短一些。但是有必要吗?至于速度,你是否在大字典上起诉这些代码,以使代码更快地合理化? –

+0

不好的实施会花费你。多维数组并不是存储这种数据的最佳方式。自定义类或字典层次结构将提供一个更加合理的结构,其中有一个更简单的查询数据的接口。 – blakev

回答

3

如何使用collections.Counter()这个快速和Python的一行代码的解决方案:

A计数器是用于计算哈希的对象的字典子类。它是一个无序集合,其中元素作为字典键存储,并且它们的计数作为字典值存储在 中。

Counter(t for u in l['users'] for p in u['photos'] for t in p['tags']) 

DEMO:

from collections import Counter 

l = {'users': [{'photos': [{'tags': [1,2,3,4,5]}, {'tags': [3,4,5]}]}, 
       {'photos': [{'tags': [1]}, {'tags': [2,3,4,5]}]}]} 

tags = Counter(t for u in l['users'] for p in u['photos'] for t in p['tags']) 
print tags # prints Counter({3: 3, 4: 3, 5: 3, 1: 2, 2: 2}) 
+0

这不是什么'打印'打印。 'tags'是一个'Counter',而不是'dict';它不会打印为“dict”。 – user2357112

+0

@ user2357112好的,很好的捕捉,修复。 – alecxe

+0

你可以放松列表理解部分,并使其成为相同结果的生成器。即'Counter'(t代表u'in'['users']代表u ['photos']代表t中的p ['tags'])' – dawg

1

使用collections.defaultdict(int),将使用0作为默认值的任意键不已经有一个:

import collections 
tags = collections.defaultdict(int) 
for u in l['users']: 
    for p in u['photos']: 
     for t in p['tags']: 
      tags[t] +=1 

此外,if tags.get(t)是一个不错的方法,以检查是否ttags关键,尤其是因为在布尔上下文中值可能被视为错误的上下文中,它会失败。身高:以下内容:

if t in tags: