Как отобразить список, содержащий количество отдельных букв в списке имен? - PullRequest
0 голосов
/ 30 марта 2020

У меня есть список имен и список алфавита. Я могу определить количество одной буквы за раз. Как проверить, наберите python go в моем списке алфавитов и добавьте их по порядку.

listOfNames = ["Euclid", "Archimedes", "Newton", "Descartes", "Fermat", "Turing",
               "Euler", "Einstein", "Boole", "Fibonacci", "Lovelace", "Noether",
               "Nash", "Wiles", "Cantor", "Gauss", "Plato"]

alphaList = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
alphaCount = []
letterCount = 0
for names in listOfNames:
    for letter in names:
        if letter.lower() in alphaList[0]:
            letterCount += 1
alphaCount.append(letterCount)
print(alphaCount)

Outcome == [9]
expected outcome == [9, 2,.....] #number of 'a's , number of 'b's...etc

Ответы [ 4 ]

2 голосов
/ 30 марта 2020

Вы можете изменить свой код, чтобы вместо этого создать словарь подсчета для каждой буквы

alphaCount = {}
for name in listOfNames:
    for letter in name:
        letter_lower = letter.lower()
        if letter_lower in alphaCount:
            alphaCount[letter_lower] += 1
        else:
            alphaCount[letter_lower] = 1

Результат

>>> alphaCount
{'e': 17, 'u': 4, 'c': 7, 'l': 7, 'i': 8, 'd': 3, 'a': 9, 'r': 7, 'h': 3, 'm': 2, 's': 8, 'n': 9, 'w': 2, 't': 8, 'o': 8, 'f': 2, 'g': 2, 'b': 2, 'v': 1, 'p': 1}

Если вы хотите получить список подсчетов в алфавитном порядке, вы можете использовать этот словарь в понимании списка

>>> [alphaCount.get(i, 0) for i in alphaList]
[9, 2, 7, 3, 17, 2, 2, 3, 8, 0, 0, 7, 2, 9, 8, 1, 0, 7, 8, 8, 4, 1, 2, 0, 0, 0]
1 голос
/ 30 марта 2020

Вы можете попробовать это.

from itertools import chain
from collections import Counter
list_name=map(str.lower,listOfNames)
out=Counter(chain.from_iterable(list_name))
# Counter({'e': 17, 'a': 9, 'n': 9, 'i': 8, 's': 8, 't': 8, 'o': 8, 'c': 7, 'l': 7, 'r': 7, 'u': 4, 'd': 3, 'h': 3, 'm': 2, 'w': 2, 'f': 2, 'g': 2, 'b': 2, 'v': 1, 'p': 1})

Чтобы получить в алфавитном порядке отсчетов

[out[k] for k in alphaList]
# [9, 2, 7, 3, 17, 2, 2, 3, 8, 0, 0, 7, 2, 9, 8, 1, 0, 7, 8, 8, 4, 1, 2, 0, 0, 0]
0 голосов
/ 30 марта 2020

комбинация join и Counter будет хорошим решением

listOfNames = ["Euclid", "Archimedes", "Newton", "Descartes", "Fermat", "Turing",
               "Euler", "Einstein", "Boole", "Fibonacci", "Lovelace", "Noether",
               "Nash", "Wiles", "Cantor", "Gauss", "Plato"]

r = "".join(listOfNames).lower()

from collections import Counter

sol = Counter(r)
print(sol)

выход

Counter({'e': 17, 'a': 9, 'n': 9, 'i': 8, 's': 8, 't': 8, 'o': 8, 'c': 7, 'l': 7, 'r': 7, 'u': 4, 'd': 3, 'h': 3, 'm': 2, 'w': 2, 'f': 2, 'g': 2, 'b': 2, 'v': 1, 'p': 1})

способ 2 с использованием while

# your code goes here

listOfNames = ["Euclid", "Archimedes", "Newton", "Descartes", "Fermat", "Turing",
               "Euler", "Einstein", "Boole", "Fibonacci", "Lovelace", "Noether",
               "Nash", "Wiles", "Cantor", "Gauss", "Plato"]
length = len(listOfNames)
count = 0

solution = {'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 0,
'f': 0, 'g': 0, 'h': 0, 'i': 0, 'j': 0, 'k': 0, 
'l': 0, 'm': 0, 'n': 0, 'o': 0, 'p': 0, 'q': 0,
'r': 0, 's': 0, 't': 0, 
'u': 0, 'v': 0, 'w': 0, 'x': 0, 'y': 0, 'z': 0}

while count<length:
    for character in listOfNames[count]:
        solution[character.lower()]+=1
    count+=1


print(solution)

вывод

{'a': 9, 'b': 2, 'c': 7, 'd': 3, 'e': 17, 
 'f': 2, 'g': 2, 'h': 3, 'i': 8, 'j': 0,
 'k': 0, 'l': 7, 'm': 2, 'n': 9, 'o': 8,
 'p': 1, 'q': 0, 'r': 7, 's': 8, 't': 8, 
 'u': 4, 'v': 1, 'w': 2, 'x': 0, 'y': 0, 
 'z': 0}
0 голосов
/ 30 марта 2020

Гораздо более простой код с defaultdict . Попробуйте это:

from collections import defaultdict

listOfNames = ["Euclid", "Archimedes", "Newton", "Descartes", "Fermat", "Turing",
               "Euler", "Einstein", "Boole", "Fibonacci", "Lovelace", "Noether",
               "Nash", "Wiles", "Cantor", "Gauss", "Plato"]

di = defaultdict(int)
for name in listOfNames:
    for letter in name:
        di[letter.lower()] += 1

print(dict(di))

Выходы:

{'e': 17, 'u': 4, 'c': 7, 'l': 7, 'i': 8, 'd': 3, 'a': 9, 'r': 7, 'h': 3, 'm': 2, 's': 8, 'n': 9, 'w': 2, 't': 8, 'o': 8, 'f': 2, 'g': 2, 'b': 2, 'v': 1, 'p': 1}

РЕДАКТИРОВАНИЕ:

Я не скажу, что это самое эффективное решение, но оно работает. Чтобы создать список алфавитов, я использовал string.ascii_lowercase в string модуле.

from collections import defaultdict
import string

listOfNames = ["Euclid", "Archimedes", "Newton", "Descartes", "Fermat", "Turing",
               "Euler", "Einstein", "Boole", "Fibonacci", "Lovelace", "Noether",
               "Nash", "Wiles", "Cantor", "Gauss", "Plato"]

di = defaultdict(int)
for name in listOfNames:
    for letter in name:
        di[letter.lower()] += 1


alphaCount = [dict(di).get(i, 0) for i in list(string.ascii_lowercase)]
print(alphaCount)

Выходы:

[9, 2, 7, 3, 17, 2, 2, 3, 8, 0, 0, 7, 2, 9, 8, 1, 0, 7, 8, 8, 4, 1, 2, 0, 0, 0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...