#python #python-3.x #list #timeout #deque
#python #python-3.x #Список #тайм-аут #deque
Вопрос:
Я написал следующий код для вывода количества отдельных слов из входных данных, а также их количества вхождений для каждого отдельного слова в соответствии с их появлением во входных данных.
Я использовал метод добавления и подсчета списка и получил желаемый результат, но некоторые тестовые примеры не выполнялись из-за ошибки тайм-аута.
n = int(input())
ar = []
for _ in range(n):
ar.append(input().rstrip())
def wordOrder(n, ar):
w_list =[] #list contains the number of repition of words
u_list =[] #list eliminates the duplicates while maintaining the same order
for i in ar:
if i not in u_list:
u_list.append(i)
w_list.append(ar.count(i))
return w_list
result = wordOrder(n, ar)
print(len(result))
print(*result, sep=' ')
Итак, я попытался использовать deque вместо list, думая, что это может быть связано с проблемой временной сложности O (n) для метода добавления списка. Но я получаю ту же ошибку даже после использования deque.
Мой вопрос в том, связана ли проблема с временной сложностью или с некоторыми другими факторами? Было бы здорово, если бы кто-нибудь мог объяснить, какие методы следует адаптировать, чтобы избежать ошибки тайм-аута.
Пример ввода:
4
bcdef
abcdefg
bcde
bcdef
Пример вывода:
3
2 1 1
Комментарии:
1. Вы используете неправильную структуру данных для этой проблемы. Как насчет словаря?
2.
deque
иlist
имеют аналогичную производительность дляappend
операций. Вы должны использоватьdeque
, если в вашем коде многоappendLeft
операций.3. Кроме того, вы можете получить ошибку тайм-аута, если ваша программа занимает слишком много места.
4. @Shiva Спасибо за предложение. Похоже, я не должен использовать deque в такой ситуации в качестве замены списка.
5. @zenalc Да, я пытался использовать словарь для решения этой проблемы, но порядок, в котором они были расположены, вызвал проблему. Не думал об использовании Counter(), потому что я думал, что там будет та же проблема с порядком. Но Counter() теперь отлично справился с этой проблемой.
Ответ №1:
Этот код отлично работает для меня
from collections import Counter
a=[]
for i in range(int(input())):
a.append(input())
x = Counter(a)
print(len(x.keys()))
print(*x.values())
Комментарии:
1. Да, этот код решает проблему. Спасибо за это! Итак, усложняет ли проблему использование метода добавления списка? Кроме того, кажется, что я должен избегать deque, если только он не используется по прямому назначению, например, операция appendLeft. Это так?
2. Счетчик — это подкласс dict. Это неупорядоченная коллекция, в которой элементы и их соответствующее количество хранятся в виде словаря.
3. Что ж, это выглядит довольно простым способом решения этой проблемы. Может быть, мне полезно решить подобные проблемы с кодированием в python.
Ответ №2:
Хотя, к счастью, в этой проблеме работает только Counter() , безопасно использовать OrderedDict(), чтобы сохранить существующий порядок предоставленных входных данных. Следовательно, приведенный ниже код должен нормально работать во всех подобных ситуациях, и он не принес никакой «ошибки тайм-аута», чего я и хотел.
from collections import Counter, OrderedDict
a=[]
for i in range(int(input())):
a.append(input())
x = OrderedDict(Counter(a))
print(len(x.keys()))
print(*x.values())