学习Python和使用字典
我正在进行中的练习,据我所知,没有任何公开的解决方案 在任何情况下,我都试图在删除重复项之前,使用字典计算原始列表中某个数字的出现次数。出于某种原因,尽管下面的主题有很多变化,但我似乎无法增加字典中每个“键”的值 我怎么能用字典来编码呢学习Python和使用字典,python,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
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
这样做很容易:
>>> 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})
>>从集合导入defaultdict
>>>seq=[2,4,5,2,4,6,3,8,9,3,7,2,47,2]
>>>seqDic=defaultdict(int)
>>>对于序号中的v:
... seqDic[v]+=1
>>>打印顺序
defaultdict(,{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
这个怎么样:
#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,可以使用
集合。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}
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
这种简单的方法在这里尤其有效,因为无论怎样,为了构建dv
以及seqDic
,您都需要if-in-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)
Edit:如果您不考虑dv
中项目的顺序(而不是希望dv
与seq
中第一次出现的项目的顺序相同),则只需使用(在循环的简单版本之后)
同样有效(在Python2中,.keys
返回一个列表),同样有效
dv = list(seqDic)
这在Python2和Python3中都很好。在相同的假设下(即您不关心dv
中项目的顺序),还有其他好的解决方案,例如
seqDic = dict.fromkeys(seq, 0)
for i in seq: seqDic[i] += 1
dv = list(seqDic)
在这里,我们首先使用字典的fromkeys
类方法来构建一个新的dict,该dict已经将0
作为每个键对应的值,因此我们可以只增加每个条目,而无需采取.get
或成员资格检查等预防措施
for v in seq:
try:
seqDic[v] += 1
except KeyError:
seqDic[v] = 1
我一直都是这样做的
除此之外,它比在处理元素之前测试成员身份要快得多,因此如果您有几十万个元素,则可以节省大量时间。如果您想使用此方法,可以使用集合来获取dv。+1使用defaultdict。在python 3.0+中,使用collections.Counter。关于您的代码:i=1赋值是错误的,并且无论如何都没有使用。范围从0开始,而不是从1开始。范围内的“-1”(len(dv)-1)也错误。此外,您应该查看
枚举
内置而不是使用range(len(dv))。+1关于OP的一个优点,即不要使用defaultdict
从中学习。可能在构建字典后一次构建所有键的列表:dv=list(seq.keys())
@hughdbrown,如果您不关心保留项目的顺序,那么实际上.keys
是可以的(Python 2中不需要list()
,并且通过使用print
作为关键字,我们可以推断出他们正在使用Python 2)。但是在这种情况下,还有其他解决方案,让我编辑A来显示它们。+1是比我的答案更完整的答案,以及上面的set
注释。字典键还提供dv。如果您正在生成字典,这甚至比使用集合更好。
for v in seq:
try:
seqDic[v] += 1
except KeyError:
seqDic[v] = 1