Чаще всего письма в списке


Я уже писал в этом блоге, но получил некоторую обратную связь, что есть лучшие способы справиться с ситуацией. Я хотел бы получить еще несколько мнений. Вот это тема:

Дается список письма, я хочу найти наиболее часто видели.

# create the list of letters
my_list = ['b', 'b', 'b', 'c', 'a', 'b']

# simple sentence to make all more "user friendly"
sentence = '\nLetter which repeat the most is: '

# 3 lists declared globally which will store our values
a_list = []
b_list = []
c_list = []

# for loop which control the letters in the list and append them to the respective list
for v in my_list:
    if v == 'a':
        a_list.append(v)

    elif v == 'b':
        b_list.append(v)

    elif v == 'c':
        c_list.append(v)

# create a variable which store the name of the letter and how many times appear in the main list
A = a_list[0], len(a_list)
B = b_list[0], len(b_list)
C = c_list[0], len(c_list)

# variable which store length values
total_list = A[1], B[1], C[1]

# find the max value
largest = max(total_list)

# in this loop we are going to compare each value from total_list to the largest one
for i, val in enumerate(total_list):
    if total_list[i] == largest:
        x = total_list[i]  # assign to "x" this value

        # do a check for all the values
        # if the condition is satisfied, then print the sentence and letter (to uppercase)
        if x == A[1]:
            print(sentence + str(A[0]).upper())
        elif x == B[1]:
            print(sentence + str(B[0]).upper())
        elif x == C[1]:
            print(sentence + str(C[0]).upper())

Я слышал, что collections.Counter могут быть использованы для этого, но я не уверен, что на выходе будет то же самое. Я мог бы использовать его, чтобы заменить мой код выше, но я в конечном итоге с тем же результатом?



1411
10
задан 9 февраля 2018 в 06:02 Источник Поделиться
Комментарии
2 ответа

Есть несколько проблем с этим, в основном, что вы только поддержать букв a, bи c. Это не обязательно проблема, если только эти письма, которые вы будете когда-либо узнать, но то, что проблема заключается в том, что вы делаете одинаковые переменные с одинаковым поведением, для каждой буквы. Затем для каждой буквы, которую вы хотите добавить в будущем, вам придется повторить себя. В любое время вы видите себя с рисунком такой, он кричит для вас, чтобы использовать словарь, или ситуативно список списков.

Делая это изменение, мы бы в конечном итоге с чем-то подобным

counter = {}
for letter in my_list:
if letter not in counter:
counter[letter] = 0
counter[letter] += 1

largest = 0
best_letters = []
for letter, count in counter.items():
if count > largest:
largest = count
best_letter = [letter]
elif count == largest:
best_letter.append(letter)

print()
for letter in best_letters:
print("Letter which repeats the most is: {}".format(letter.upper()))

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

Мы можем сделать это лучше, хотя, как вы предположили с collections.Counter. А Counter уже много этой работы. Например, для подсчета мы просто делаем

counter = Counter(my_list)

Затем, чтобы получить лучшее, мы просто делаем

best_letter, largest = counter.most_common(1)[0]

Это делает вашу программу выглядеть так

best_letter, _ = Counter(my_list).most_common(1)[0]
print()
print("Letter which repeats the most is: {}".format(best_letter.upper()))

В общем, это всегда хорошо, чтобы написать функции для инкапсуляции поведения, но в этом случае можно, пожалуй, только встроенного использования Counter.

Теперь, если мы хотим получить все письма, которые являются наиболее частыми, мы можем очень легко изменить ее. Мы вместо этого:

most_common = counter.most_common(len(counter)) 
largest = most_common[0][1]

for letter, count in most_common:
if count < largest:
break

print("Letter which repeats the most is: {}".format(letter.upper())

Что возьму все значения в порядке наиболее до наименее частых, и затем цикл через все из них, которые наиболее часто встречаются. Обратите внимание, что нет неявного сортировки в те, которые разделяют частоты; если вы хотите более ограничений на что потребуется дополнительная логика.

13
ответ дан 9 февраля 2018 в 06:02 Источник Поделиться

Я хотел бы использовать угорники max функция для этого:

my_string = 'abcaaacccbbaaabaccaa'
count_these = 'abc'
most_popular = max(count_these, key=my_string.count)

кстати. Узнал это на checkio.org :)

0
ответ дан 10 февраля 2018 в 03:02 Источник Поделиться