在字符串中查找值出现时嵌套的for循环和字典

Chr*_*ngj 10 python dictionary

我的任务是创建一个字典,其字符串是在字符串中找到的元素,其值计算每个值的出现次数.

防爆.

"abracadabra" ? {'r': 2, 'd': 1, 'c': 1, 'b': 2, 'a': 5}
Run Code Online (Sandbox Code Playgroud)

我在这里有for循环逻辑:

xs = "hshhsf"
xsUnique = "".join(set(xs))

occurrences = []
freq = []

counter = 0

for i in range(len(xsUnique)):
    for x in range(len(xs)):
        if xsUnique[i] == xs[x]:
            occurrences.append(xs[x])
            counter += 1
    freq.append(counter)
    freq.append(xsUnique[i])
counter = 0 
Run Code Online (Sandbox Code Playgroud)

这正是我想要它做的,除了列表而不是字典.我怎样才能使它counter成为一个价值,并xsUnique[i]成为新词典中的关键?

daw*_*awg 7

最简单的方法是使用一个计数器:

>>> from collections import Counter
>>> Counter("abracadabra")
Counter({'a': 5, 'r': 2, 'b': 2, 'c': 1, 'd': 1})
Run Code Online (Sandbox Code Playgroud)

如果你不能使用Python库,你可以使用dict.get和默认值0来制作你自己的计数器:

s="abracadabra"
count={}
for c in s:
    count[c] = count.get(c, 0)+1

>>> count
{'a': 5, 'r': 2, 'b': 2, 'c': 1, 'd': 1}    
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用dict.fromkeys()将计数器中的所有值设置为零,然后使用:

>>> counter={}.fromkeys(s, 0)
>>> counter
{'a': 0, 'r': 0, 'b': 0, 'c': 0, 'd': 0}
>>> for c in s:
...    counter[c]+=1
... 
>>> counter
{'a': 5, 'r': 2, 'b': 2, 'c': 1, 'd': 1}
Run Code Online (Sandbox Code Playgroud)

如果你真的想要最少的Pythonic,也就是你可能在C中做什么,你可能会这样做:

  1. 为所有可能的ascii值创建一个列表 0
  2. 循环遍历字符串并计算存在的字符
  3. 打印非零值

例:

ascii_counts=[0]*255
s="abracadabra"

for c in s:
    ascii_counts[ord(c)]+=1

for i, e in enumerate(ascii_counts):
    if e:
        print chr(i), e 
Run Code Online (Sandbox Code Playgroud)

打印:

a 5
b 2
c 1
d 1
r 2
Run Code Online (Sandbox Code Playgroud)

但是,这不适用于Unicode,因为您需要超过100万个列表条目...