我试图了解以下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
以下是我到目前为止所理解的内容,之后我会提出问题:
howMany
存储0和0之间生成的随机数。 1000包括两者。
stats = {}
声明一个空字典
i
将根据howMany
的值运行。例如,howMany
已为2,因此i
将运行两次,其值为0
和1
。
value
变量存储0
&之间的随机数。 500
包括
我不理解stats.setdefault(value,0)
。例如,value
变量的值为4
,那么stats.setdefault(4,0)
意味着什么?
stats[value]+=1
做了什么? stats[value]+=1
的扩展形式是
stats[value] = value + 1
我理解以下段落:
for item in stats:
if stats[item] > 1:
print item
打印的值大于1
字典中的stats
。如果我在某处出错,请纠正我。
答案 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
虽然+=
对于不同的对象可能会有不同的行为,但有关详细信息,请阅读:
答案 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