[英]Learning Python and using dictionaries
我正在通过Python构建技能中的练习,据我所知,该练习没有任何已发布的解决方案。
无论如何,在删除重复项之前,我都试图让字典对原始列表中某个数字的出现次数进行计数。 由于某些原因,尽管下面的主题有很多变体,但我似乎无法增加字典中每个“键”的值。
如何用字典编码?
dv = list()
# arbitrary sequence of numbers
seq = [2,4,5,2,4,6,3,8,9,3,7,2,47,2]
# dictionary counting number of occurances
seqDic = { }
for v in seq:
i = 1
dv.append(v)
for i in range(len(dv)-1):
if dv[i] == v:
del dv[-1]
seqDic.setdefault(v)
currentCount = seqDic[v]
currentCount += 1
print currentCount # debug
seqDic[v]=currentCount
print "orig:", seq
print "new: ", dv
print seqDic
defaultdict使这变得容易:
>>> from collections import defaultdict
>>> seq = [2,4,5,2,4,6,3,8,9,3,7,2,47,2]
>>> seqDic = defaultdict(int)
>>> for v in seq:
... seqDic[v] += 1
>>> print seqDic
defaultdict(<type 'int'>, {2: 4, 3: 2, 4: 2, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 47: 1})
我不太确定您要怎么做..计算每个数字出现的频率?
#arbitrary sequence of numbers
seq = [2,4,5,2,4,6,3,8,9,3,7,2,47,2]
#dictionary counting number of occurances
seqDic = {}
### what you want to do, spelled out
for number in seq:
if number in seqDic: # we had the number before
seqDic[number] += 1
else: # first time we see it
seqDic[number] = 1
#### or:
for number in seq:
current = seqDic.get(number, 0) # current count in the dict, or 0
seqDic[number] = current + 1
### or, to show you how setdefault works
for number in seq:
seqDic.setdefault(number, 0) # set to 0 if it doesnt exist
seqDic[number] += 1 # increase by one
print "orig:", seq
print seqDic
defaultdict
不是dict
(它是一个子类,可能会为您做太多工作,无法帮助您通过本练习学习),因此这是使用简单dict
的一种简单方法:
dv = list()
# arbitrary sequence of numbers
seq = [2,4,5,2,4,6,3,8,9,3,7,2,47,2]
# dictionary counting number of occurances
seqDic = { }
for i in seq:
if i in seqDic:
seqDic[i] += 1
else:
dv.append(i)
seqDic[i] = 1
这种简单的方法在这里特别好用,因为无论如何if i in seqDic
都需要if i in seqDic
测试来构建dv
和seqDic
。 否则,更简单的方法是:
for i in seq:
seqDic[i] = 1 + seqDic.get(i, 0)
使用dict
的便捷方法get
,如果第一个不是字典中的键,则返回第二个参数。 如果您喜欢这个主意,以下是一个可以构建dv
的解决方案:
for i in seq:
seqDic[i] = 1 + seqDic.get(i, 0)
if seqDic[i] == 1: dv.append(i)
编辑 :如果您不关心dv
中项目的顺序(而不是希望dv
与seq
第一次出现项目的顺序相同),则只需使用(在循环的简单版本之后)
dv = seqDic.keys()
也可以使用(在Python 2中, .keys
返回列表),所以也可以
dv = list(seqDic)
在Python 2 和 Python 3中都可以。在相同的假设(您不必关心dv
中项目的顺序)下,还有其他一些好的解决方案,例如
seqDic = dict.fromkeys(seq, 0)
for i in seq: seqDic[i] += 1
dv = list(seqDic)
在这里,我们首先使用字典的fromkeys
类方法构建一个新的字典,该字典已经具有0
作为与每个键对应的值,因此我们可以直接增加每个条目而无需采取诸如.get
或成员资格检查这样的预防措施。
这个怎么样:
#arbitrary sequence of numbers
seq = [2,4,5,2,4,6,3,8,9,3,7,2,47,2]
#dictionary counting number of occurances
seqDic = { }
for v in seq:
if v in seqDic:
seqDic[v] += 1
else:
seqDic[v] = 1
dv = seqDic.keys()
print "orig:", seq
print "new: ", dv
print seqDic
它很干净,我认为它演示了您正在尝试以简单的方式学习如何做的事情。 正如其他人指出的那样,可以使用defaultdict进行此操作,但是知道如何以这种方式进行操作也很有启发性。
或者,如果您使用Python3,则可以使用collections.Counter
,尽管它是子类,但实际上是dict
。
>>> from collections import Counter
>>> seq = [2,4,5,2,4,6,3,8,9,3,7,2,47,2]
>>> Counter(seq)
Counter({2: 4, 3: 2, 4: 2, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 47: 1}
for v in seq:
try:
seqDic[v] += 1
except KeyError:
seqDic[v] = 1
这就是我一直做这样的事情的内在循环的方式。
除了其他方面,它比在处理元素之前测试成员资格要快得多,因此,如果您有数十万个元素,则可以节省大量时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.