1

我正在尝试理解以下 python 代码,因为我是新手。

import random

howMany = random.randint(0,1000)
stats = {}
for i in range(howMany):
   value = random.randint(0,500)
   stats.setdefault(value,0)
   stats[value]+=1
for item in stats:
   if stats[item] > 1:
       print item

这是我到目前为止所理解的,我的问题将在之后进行:

  1. howMany存储在 0 和 1000 之间生成的随机数,包括两者。

  2. stats = {}声明一个空字典

  3. i将根据 的值运行howMany。例如,如果howMany 是 2,那么将使用值 is和i运行两次。01

  4. value变量存储0&之间500的随机数,包括两者

  5. 我不明白stats.setdefault(value,0)。例如,value变量有 value 4,那么stats.setdefault(4,0)意味着什么?

  6. 做什么stats[value]+=1?的扩展形式stats[value]+=1stats[value] = value + 1?

  7. 我理解了以下段落:

    for item in stats:
       if stats[item] > 1:
           print item
    

    打印的值大于字典1中的值。stats如果我在某个地方错了,请纠正我。

4

5 回答 5

3

5. dict.setdefault(key, default)这样做:

如果键在字典中,则返回其值。如果不是,则插入值为默认值的键并返回默认值。默认默认为无。

因此,它确保所有键都以 0 作为关联值开头。

stats.setdefault(value, 0)

因此等价于

if value not in stats:
    stats[value] = 0

6.不,但这些是等价的(很好,glglgl):

stats[value] += 1
stats[value] = stats[value] + 1

stats它们在( __iadd__vs. )中导致两个不同的方法调用__setitem__,因此对于某些对象,它们确实不同,但在这里它们是等价的。有关此示例,请参阅 Ashwini 答案中的出色链接。

7.此代码打印出所有多次出现的值。

在 python 2.7+ 中,您的代码示例最好使用collections.Counter类编写:

import random
import collections

howMany = random.randint(0,1000)
stats = collections.Counter(random.randint(0, 500) for i in range(howMany))
for item in stats:
   if stats[item] > 1:
       print item
于 2013-05-08T08:44:44.880 回答
2

stats.setdefault(value,0)表示如果存在名为的键valuestats则返回其值,否则创建一个名为的新键并将其值value设置为0然后返回 0。

>>> dic = {}
>>> dic.setdefault("foo",5)  #creates a new key "foo" with value 5 and returns 5
5
>>> dic
{'foo': 5}
>>> dic.setdefault("foo",10)  # "foo" is already present then simply return it's value
5

帮助dict.setdefault:_

>>> dict.setdefault?
String Form:<method 'setdefault' of 'dict' objects>
Namespace:  Python builtin
Docstring:  D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D

stats[value]+=1 有什么作用?

stats[value]+=1相当于stats[value] = stats[value] +1

虽然+=对于不同的对象可能会有不同的行为,但有关详细信息,请阅读以下内容:

Python中的“i += x”何时与“i = i + x”不同?

于 2013-05-08T08:44:14.633 回答
2

我不明白“stats.setdefault(value,0)”。比如“value”变量的值为4,那么stats.setdefault(4,0)是什么意思呢?

setdefault()当传入的键不匹配时,字典 的方法返回一个值。value是要搜索的键,0是在没有找到键时设置和返回的值。

它用于避免KeyError异常,并为不存在的键设置默认值:

>>> d = {'a': 1}
>>> d['b']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'b'
>>> d.setdefault('b',2)
2
>>> d
{'a': 1, 'b': 2}

“stats[value]+=1”有什么作用?stats[value]+=1 的扩展形式是 stats[value] = value + 1 吗?

不完全是,意思是stats[value] = stats[value] + 1

于 2013-05-08T08:45:09.647 回答
1

stats.setdefault(value,0)将为stats[value]to设置默认值0。也就是说,只有当它之前没有与之关联的值时,该值才0与键关联。value它的效果与以下内容相同:

if not stats.has_key(value):
    stats[value] = 0

这意味着一次value被看到时,它将有一个0与之关联的值。stats[value]+=1这很重要,因为您无法执行扩展为的下一步stats[value] = stats[value]+1,因为它需要 stats[value]定义,在这种情况下,它被定义为零(如果这是 的第一次出现value,由于.setdefault(value,0))。之后它会增加,下一次stats.setdefault(value,0)是多余的,因为它已经有一个值。

以下应该使什么setdefault更明显:

>>> d = {} #make a dictionary
>>> d.setdefault("key",100) #associate the value 100, with the key "key"
100
>>> d["key"] #see what is associated with "key"
100
>>> d["key"]+=100 #increment by 100
>>> d["key"] #test to see if incrementing worked
200
>>> d["notkey"]+=100 #demo to show what happens if we hadn't done defaultdict


Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    d["notkey"]+=100
KeyError: 'notkey'

>>> d.setdefault("notkey",100) #set a default
100
>>> d["notkey"]+=100
>>> d["notkey"]
200
于 2013-05-08T08:44:25.527 回答
1

5)来自文档:

setdefault(key[, default])

如果键在字典中,则返回其值。如果不是,则插入值为 的键default并返回defaultdefault默认为None.

6) 几乎相同stats[value] = stats[value] + 1

操作员+=“就地”执行操作,在某些情况下可以修改现有对象。此外,这些运算符可能是不同的行为,因为它是由不同的方法__add__和确定的__iadd__。但是,在大多数情况下,您不必担心,因为如果__iadd__未显式覆盖 method ,则扩充的赋值会回退到 method __add__

不同行为的示例:

>>> y = x = [1, 2, 3]
>>> x + [4, 5]   # create *new* list
[1, 2, 3, 4, 5]
>>> y
[1, 2, 3]        # old list is not modified

>>> y = x = [1, 2, 3]
>>> x += [4, 5]  # the operation is performed "in place", new object is not created
>>> y
[1, 2, 3, 4, 5]  # value of list changes
于 2013-05-08T08:45:41.257 回答