Не получается задача: Вводиться список людей, и нужно вывести количество не повторяющихся фамилий
n - кол-во людей. Затем идут фамилии(например, Иванов, Петров). Необходимо вывести количество не повторяющихся фамилий, сами эти фамилии выводить не нужно.
n = int(input())
a = []
b = []
count = 0
for i in range(0, n):
a.append(str(input()))
for i in (0, n-1):
for j in (i, n):
if a[i] == a[j+1]:
b.append(i)
res = len(a)-len(b)*2
if res>0:
print(res)
else:
print("NO")
Выводит ошибку: list index out of range по 9 линии
Ответы (1 шт):
Автор решения: n1tr0xs
→ Ссылка
Словари
Можно использовать collections.Counter:
from collections import Counter
n = int(input())
surnames = [input() for i in range(n)]
surname_c = Counter(surnames)
cnt = sum((x == 1) for x in surname_c.values())
print(cnt)
## print(sum((x == 1) for x in Counter([input() for i in range(int(input()))]).values()))
Если нельзя библиотеки:
n = int(input())
surnames = [input() for i in range(n)]
surname_c = {surname: surnames.count(surname) for surname in set(surnames)}
cnt = sum((x == 1) for x in surname_c.values())
print(cnt)
Сокращенный вариант:
n = int(input())
surnames = [input() for i in range(n)]
cnt = sum((x == 1) for x in {surname: surnames.count(surname) for surname in set(surnames)}.values())
print(cnt)
Без словарей
filter:
n = int(input())
surnames = [input() for i in range(n)]
cnt = len(list(filter(lambda x: x==1, (surnames.count(surname) for surname in set(surnames)))))
print(cnt)
list comprehension:
n = int(input())
surnames = [input() for i in range(n)]
cnt = len([(x==1) for x in (surnames.count(surname) for surname in set(surnames))])
print(cnt)
P.S. sum и len в данном случае взаимозаменяемы в обоих выборах (словари или без словарей).