Как подсчитать количество вхождений символа в строку (список)

#python #list #count

#python #Список #подсчитать

Вопрос:

Я пытаюсь подсчитать вхождение каждого символа для любого заданного строкового ввода, вхождения должны выводиться в порядке возрастания (включая цифры и восклицательные знаки) У меня есть это для моего кода до сих пор, я знаю о функции счетчика, но она не выводит ответ в том формате, который я бы хотел, и я не знаю, как отформатировать счетчик. Вместо этого я пытаюсь найти способ использовать count() для подсчета каждого символа. Я также видел функцию dictionary , но я бы надеялся, что есть более простой способ сделать это с помощью count()

 from collections import Counter

sentence=input("Enter a sentence b'y: ")
lowercase=sentence.lower()

list1=list(lowercase)
list1.sort()

length=len(list1)
list2=list1.count(list1)
print(list2)

p=Counter(list1)
print(p)
  

Комментарии:

1. Можете ли вы объяснить, какой именно результат вы ищете, где счетчика не хватило?

2. Как вы думаете, list1.count(list1) что именно делает?

3. Вы знаете, что Counter это практически словарь? Вы можете легко отсортировать его по количеству sorted_words = sorted(p.items(), key=lambda item: item[1], reverse=True) . Вы можете распечатать это с помощью print('n'.join('s: ]' % item for item in sorted_words)) . Обратите внимание, что использование count все равно потребует от вас выполнения сортировки.

4. @idjaw Робин объясняет это в первом предложении «должно выводиться в порядке возрастания»

5. @SCB вы все равно можете сделать это с помощью Counter очень легко, используя ‘most_common’, а затем изменив это. На самом деле есть два решения, которые это показывают.

Ответ №1:

collections.Counter объекты предоставляют most_common() метод, который возвращает список кортежей с уменьшающейся частотой. Итак, если вы хотите, чтобы он отображался по возрастанию частоты, переверните список:

 from collections import Counter

sentence = input("Enter a sentence: ")
c = Counter(sentence.lower())
result = reversed(c.most_common())
print(list(result))
  

Демонстрационный запуск

Введите предложение: вот 3 предложения. Это первый. Вот второе. Конец!
[('a', 1), ('!', 1), ('3', 1), (' f', 1), ('d', 2), ('o', 2), ('c', 2), ('.', 3), ('r', 4), ('i', 4), ('n', 5), ('t', 6), ('h', 6), ('s', 7), (' ', 14),('e', 14)]

Комментарии:

1. Зачем использовать reversed, когда вы можете c.most_common()[::-1] ? reversed действительно полезен только в том случае, если вы перебираете элементы и не хотите создавать копию в соответствии с моим собственным ответом.

2. @PadraicCunningham: reversed() более читабельно. Но да, для иллюстративных целей этого ответа он делает ненужную копию.

Ответ №2:

Просто вызовите .most_common и измените вывод на reversed, чтобы получить вывод от наименьшего к наиболее распространенному:

 from collections import Counter

sentence= "foobar bar"
lowercase = sentence.lower()
for k, count in  reversed(Counter(lowercase).most_common()):
    print(k,count)
  

Ответ №3:

Если вы просто хотите отформатировать вывод счетчика по-другому:

 for key, value in Counter(list1).items():
    print('%s: %s' % (key, value))
  

Комментарии:

1. Они попросили, чтобы вывод был в порядке возрастания

2. В порядке возрастания по значению символа или по количеству вхождений?

Ответ №4:

Лучше всего использовать Counter (который работает со строкой), а затем сортировать по его выводам.

 from collections import Counter
sentence = input("Enter a sentence b'y: ")
lowercase = sentence.lower()

# Counter will work on strings
p = Counter(lowercase)
count = Counter.items()
# count is now (more or less) equivalent to
#  [('a', 1), ('r', 1), ('b', 1), ('o', 2), ('f', 1)]

# And now you can run your sort
sorted_count = sorted(count)
# Which will sort by the letter. If you wanted to
#  sort by quantity, tell the sort to use the
#  second element of the tuple by setting key:

# sorted_count = sorted(count, key=lambda x:x[1])

for letter, count in sorted_count:
    # will cycle through in order of letters.
    #  format as you wish
    print(letter, count)
  

Комментарии:

1. key = lambda x:x[0] на самом деле здесь ничего не делается, поскольку кортежи уже отсортированы «лексикографически». Кроме того, я считаю, что OP хочет сортировать в порядке возрастания на основе подсчетов , так lambda x:x[1] что, но это неясно.

Ответ №5:

Еще один способ избежать использования счетчика.

 sentence = 'abc 11 222 a AAnn zzz?? !'
list1 = list(sentence.lower())
#If you want to remove the spaces.
#list1 = list(sentence.replace(" ", ""))

#Removing duplicate characters from the string  
sentence = ''.join(set(list1))
dict = {}
for char in sentence:
    dict[char] = list1.count(char)

for item in sorted(dict.items(), key=lambda x: x[1]):
    print 'Number of Occurences of %s is %d.' % (item[0], item[1])
  

Вывод:

 Number of Occurences of c is 1.
Number of Occurences of b is 1.
Number of Occurences of ! is 1.
Number of Occurences of n is 2.
Number of Occurences of 1 is 2.
Number of Occurences of ? is 2.
Number of Occurences of 2 is 3.
Number of Occurences of z is 3.
Number of Occurences of a is 4.
Number of Occurences of   is 6.
  

Ответ №6:

Одним из способов сделать это было бы удаление экземпляров вашей вложенной строки и просмотр длины…

 def nofsub(s,ss):
    return((len(s)-len(s.replace(ss,"")))/len(ss))
  

в качестве альтернативы вы можете использовать re или регулярные выражения,

 from re import *
def nofsub(s,ss):
    return(len(findall(compile(ss), s)))
  

наконец, вы можете посчитать их вручную,

 def nofsub(s,ss):
    return(len([k for n,k in enumerate(s) if s[n:n len(ss)]==ss]))
  

Протестируйте любой из трех с помощью…

 >>> nofsub("asdfasdfasdfasdfasdf",'asdf')
5
  

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

 def countChars(s):
    s = s.lower()
    d = {}
    for k in set(s):
        d[k]=nofsub(s,k)
    for key, value in sorted(d.iteritems(), key=lambda (k,v): (v,k)):
        print "%s: %s" % (key, value)
  

Комментарии:

1. Просто используйте Counter . Это очень сильно переработано.

2. Кроме того, в вопросе ничего не говорится о количестве подстрок.

Ответ №7:

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

 from collections import Counter

sentence=raw_input("Enter a sentence b'y: ")
lowercase=sentence.lower()

list1=list(lowercase)
list(list1)

length=len(list1)
list2=list1.count(list1)
print(list2)

p=Counter(list1)
print(p)