这是一种非常奇怪的组织事物的方式。如果您存储在字典中,这很容易:
# This example should work in any version of Python.
# urls_d will contain URL keys, with counts as values, like: {'http://www.google.fr/' : 1 }
urls_d = {}
for url in list_of_urls:
if not url in urls_d:
urls_d[url] = 1
else:
urls_d[url] += 1
用于更新计数字典的代码是 Python 中的常见“模式”。这是很常见的,有一个特殊的数据结构defaultdict
,创建只是为了让这更容易:
from collections import defaultdict # available in Python 2.5 and newer
urls_d = defaultdict(int)
for url in list_of_urls:
urls_d[url] += 1
如果您defaultdict
使用密钥访问 ,并且该密钥不在 中defaultdict
,则该密钥会自动添加一个默认值。获取您传入的defaultdict
可调用对象,并调用它以获取默认值。在这种情况下,我们通过了 class int
; 当 Python 调用int()
它时,它返回一个零值。因此,第一次引用 URL 时,它的计数被初始化为零,然后您将计数加一。
但是充满计数的字典也是一种常见的模式,因此 Python 提供了一个现成的类:containers.Counter
您只需Counter
通过调用该类创建一个实例,传入任何可迭代对象;它构建了一个字典,其中键是来自可迭代对象的值,值是键出现在可迭代对象中的次数的计数。上面的例子就变成了:
from collections import Counter # available in Python 2.7 and newer
urls_d = Counter(list_of_urls)
如果您真的需要按照您展示的方式进行操作,最简单和最快的方法是使用这三个示例中的任何一个,然后构建您需要的示例。
from collections import defaultdict # available in Python 2.5 and newer
urls_d = defaultdict(int)
for url in list_of_urls:
urls_d[url] += 1
urls = [{"url": key, "nbr": value} for key, value in urls_d.items()]
如果您使用的是 Python 2.7 或更高版本,则可以单行执行:
from collections import Counter
urls = [{"url": key, "nbr": value} for key, value in Counter(list_of_urls).items()]