学习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