سؤال

I have a problem concerning a comparison between a char key in a dict and a char within a list. The Task is to read a text and count all beginning letters.

I have a list with chars:

bchars = ('i','g','h','n','h')

and a dict with the alphabet and frequency default to zero:

d = dict(dict())
  for i in range(97,123):
    d[i-97]={chr(i):0}

no i want to check like the following:

for i in range(len(bchars)):
  for j in range(len(d)):
    if(bchars[i] in d[j]):
      d[j][chr(i+97)] +=1
    else:
      d[j][chr(i+97)] +=0

so if the char in the list is a key at the certain position then += 1 else += zero I thought by using a if/else statement I can bypass the KeyError.

Is there any more elegant solution for that?

هل كانت مفيدة؟

المحلول

The specific problem is that you check whether bchars[i] is in d[j], but then the key you actually use is chr(i+97).

chr(i+97) is the index of the ith character in bchars, but mapped to ASCII characters starting from 'a'. Why would you want to use this as your key?

I think you really want to do:

for i in range(len(bchars)):
    for j in range(len(d)):
        if(bchars[i] in d[j]):
            d[j][bchars[i]] += 1
        else:
            d[j][bchars[i]] = 1

Note that you can't use += in the else; remember how you literally just checked whether the key was there and decided it wasn't?

More broadly, though, your code doesn't make sense - it is overcomplicated and does not use the real power of Python's dictionaries. d looks like:

{0: {'a': 0}, 1: {'b': 0}, 2: {'c': 0}, ...}

It would be much more sensible to build a dictionary mapping character directly to count:

{'a': 0, 'b': 0, 'c': 0, ...}

then you can simply do:

for char in bchars:
    if char in d:
        d[char] += 1

Python even comes with a class just for doing this sort of thing.

نصائح أخرى

The nested dictionary doesn't seem necessary:

d = [0] * 26
for c in bchars:
    d[ord(c)-97] += 1

You might also want to look at the Counter class in the collections module.

from collections import Counter

bchars = ('i','g','h','n','h')
counts = Counter(bchars)
print(counts)
print(counts['h']) 

prints

Counter({'h': 2, 'i': 1, 'g': 1, 'n': 1})
2
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top