学习Python和使用字典

2024-05-16 09:16:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在完成Building Skills in 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

Tags: ofin列表for字典情况数字解决方案
3条回答

我不太确定你想做什么。。计算每个数字出现的频率?在

#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让这一切变得简单:

>>> 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不是{}(它是一个子类,可能要做太多的工作来帮助您通过这个练习学习),所以下面是一个简单的方法来使用普通的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测试来构建dv以及{}。否则,更简单的方法是:

^{pr2}$

使用dict的便捷方法get,如果第一个参数不是字典中的键,则返回第二个参数。如果您喜欢这个想法,这里有一个解决方案,同时也构建dv

for i in seq:
  seqDic[i] = 1 + seqDic.get(i, 0)
  if seqDic[i] == 1: dv.append(i)

编辑:如果不区分dv中项目的顺序(而不是希望dv与{}中第一次出现的项的顺序相同),那么只需使用(在循环的简单版本之后)

dv = seqDic.keys()

也可以(在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,它已经将0作为与每个键对应的值,这样我们就可以只增加每个条目,而不必进行{}或成员资格检查。在

相关问题 更多 >