请帮助我理解Python代码

时间:2013-05-08 08:38:06

标签: python python-2.7

我试图了解以下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和0之间生成的随机数。 1000包括两者。

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

  3. i将根据howMany的值运行。例如,howMany 已为2,因此i将运行两次,其值为01

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

  5. 我不理解stats.setdefault(value,0)。例如,value变量的值为4,那么stats.setdefault(4,0)意味着什么?

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

  7. 我理解以下段落:

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

    打印的值大于1字典中的stats。如果我在某处出错,请纠正我。

5 个答案:

答案 0 :(得分:3)

5. dict.setdefault(key, default)执行此操作:

  

如果键在词典中,则返回其值。如果不是,请插入值为default的值并返回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____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

答案 1 :(得分:2)

stats.setdefault(value,0)表示value中存在名为stats的密钥,然后返回其值,否则创建一个名为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

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

When is "i += x" different from "i = i + x" in Python?

答案 2 :(得分: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

答案 3 :(得分:1)

stats.setdefault(value,0)会将stats[value]的默认值设置为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 做得更明显:

{{1}}

答案 4 :(得分:1)

5)来自文档:

  

<强> setdefault(key[, default])

     

如果键在词典中,则返回它   值。如果没有,请插入值为default的密钥并返回default。   default默认为None

6)几乎与stats[value] = stats[value] + 1

相同

运算符+=执行“就地”操作,在某些情况下可以修改现有对象。此外,这些运算符可能是不同的行为,因为它由不同的方法__add____iadd__确定。但是,在大多数情况下,您不应该担心,因为如果未明确覆盖方法__iadd__,则增强的分配将回退到方法__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