繁体   English   中英

学习Python和使用字典

[英]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测试来构建dvseqDic 否则,更简单的方法是:

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中项目的顺序(而不是希望dvseq第一次出现项目的顺序相同),则只需使用(在循环的简单版本之后)

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM