我正在尝试理解以下 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 和 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在
stats字典中打印那些大于1的值。如果我在某处有误,请纠正我。
请您参考如下方法:
5. dict.setdefault(key, default)这样做:
If key is in the dictionary, return its value. If not, insert key with a value of default and return default. default defaults to None.
因此它确保所有键都以 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
