Не получается задача: Вводиться список людей, и нужно вывести количество не повторяющихся фамилий

Рейтинг: 0Ответов: 1Опубликовано: 11.05.2023

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Принят

Словари

Можно использовать 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 в данном случае взаимозаменяемы в обоих выборах (словари или без словарей).