我想做这样的事情。
list_of_urls = ['http://www.google.fr/', 'http://www.google.fr/',
'http://www.google.cn/', 'http://www.google.com/',
'http://www.google.fr/', 'http://www.google.fr/',
'http://www.google.fr/', 'http://www.google.com/',
'http://www.google.fr/', 'http://www.google.com/',
'http://www.google.cn/']
urls = [{'url': 'http://www.google.fr/', 'nbr': 1}]
for url in list_of_urls:
if url in [f['url'] for f in urls]:
urls[??]['nbr'] += 1
else:
urls.append({'url': url, 'nbr': 1})
我该怎么办?我不知道我是否应该把元组编辑它或计算出元组索引?
有什么帮助吗?
7条答案
按热度按时间i7uq4tfw1#
这是一种非常奇怪的组织方式。如果你存储在字典中,这很容易:
这段更新计数字典的代码是Python中常见的“模式”。它是如此普遍,以至于有一个特殊的数据结构,
defaultdict
,只是为了使它更容易:如果您使用密钥访问
defaultdict
,并且该密钥不在defaultdict
中,则会自动添加该密钥,并使用默认值。defaultdict
接受您传入的可调用对象,并调用它以获取默认值。在本例中,我们传入了类int
;当Python调用int()
时,它返回一个零值。因此,第一次引用URL时,它的计数被初始化为零,然后在计数上加1。但是一个充满计数的字典也是一种常见的模式,所以Python提供了一个现成的类:
containers.Counter
您只需通过调用类创建一个Counter
示例,传入任何可迭代对象;它构建一个字典,其中键是来自可迭代对象的值,值是键在可迭代对象中出现的次数的计数。上面的例子变成:如果你真的需要用你展示的方法来做,最简单和最快的方法是使用这三个例子中的任何一个,然后构建你需要的那个。
如果你使用的是Python 2.7或更高版本,你可以在一行代码中完成:
pgccezyw2#
使用默认值可以工作,但也可以:
使用
.get
,你可以得到一个默认的返回,如果它不存在。默认情况下,它是None,但在我发送给您的案例中,它将是0。qyuhtwio3#
使用defaultdict:
qv7cva1a4#
这对我来说总是很好:
2exbekwf5#
除了第一次之外,每次看到一个单词时,if语句的测试都会失败。如果你要计算大量的单词,很多单词可能会出现多次。在一个值的初始化只会发生一次,而该值的增加会发生很多次的情况下,使用try语句更便宜:
你可以阅读更多关于这个:https://wiki.python.org/moin/PythonSpeed/PerformanceTips
hfsqlsce6#
完全按照你的方式去做?你可以用for...else结构
但它很不优雅。你真的必须把访问过的URL存储为LIST吗?例如,如果你把它排序为一个dict,通过url字符串索引,它会更干净:
在第二个例子中需要注意的几点:
urls
消除需要通过整个urls
列表时,测试一个单一的url
.这种方法会更快。dict( )
代替大括号可以使代码更短list_of_urls
、urls
和url
作为变量名会使代码很难解析。最好找一些更清晰的,比如urls_to_visit
、urls_already_visited
和current_url
。我知道,它更长。但它更清晰。当然,我假设
dict(url='http://www.google.fr', nbr=1)
是您自己的数据结构的简化,因为否则,urls
可能只是:使用defaultdict的立场可以变得非常优雅:
wribegjk7#
它也可以用标准字典来完成。