#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)