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

Файл электронной таблицы содержит в каждой строке семь натуральных чисел. Определите сумму всех чисел в строке таблицы с наименьшим номером, для чисел которой выполнены условия:

  • в строке есть два числа, каждое из которых повторяется дважды, остальные три числа различны;

  • максимальное число строки не повторяется.

В ответе запишите только число.

f = open("9")
cnt = 0
for s in f:
    a = list(map(int, s.split()))
    povt = [x for x in a if a.count(x) > 1]
    ne_povt = [x for x in a if a.count(x) == 1]
    if (len(ne_povt) == 3 and len(set(povt)) == 2) and max(ne_povt) == 1:
        cnt += 1
print(cnt)

Ответы (3 шт):

Автор решения: MBo

С максимумом вы что-то не то делаете, нужен же общий максимум. И при нахождении подходящей строки нужно вывести сумму и остановиться.

if len(ne_povt) == 3 and len(set(povt)) == 2 and (max(a) in ne_povt):
    print(sum(a))
    break
→ Ссылка
Автор решения: geo
with open('9') as fl:
    for rec in fl:
        numbers = tuple(int(i) for i in rec.split())
        mx = max(numbers)
        numbers_repeat = set(i for i in numbers if numbers.count(i) == 2)  # есть ли повторения 2 по 2
        other_numbers = set(i for i in numbers if i not in (numbers_repeat)) # получаем остальные 3 различных числа

        if len(numbers_repeat) == 2 and len(other_numbers) == 3 and mx not in (i for i in numbers if numbers.count(i)>1):
            print(sum(numbers))
            break
→ Ссылка
Автор решения: Vitalizzare ушел в монастырь

Решение использовать count в конструкции вида [x for x in a if a.count(x) ...], где a - это список, несколько опрометчиво. При малых размерах вы можете не заметить, что у этого подхода сложность O(n²), т.е. на каждом элементе вы гарантированно проходите список от начала до конца. Обратите внимание на collections.Counter (вопрос о сложности алгоритма в реализации этого класса обсуждается здесь).

Один из вариантов, как решить задачу:

from collections import Counter 


path = ...    # путь к файлу данных
answer = None

with open(path) as file:
    for line in file:
        data = [*map(int, line.split())]
        freq = Counter(data)     # частота появления чисел
        if len(freq) == 5 and max(freq.values()) == 2 and freq[max(data)] == 1:
            answer = sum(data)
            break

print(answer)

Здесь мы исходим из предположения, что в каждой строке строго 7 чисел. Тогда нам достаточно проверить, что уникальных чисел 5, максимальная частота 2, а частота максимального числа равна 1.

→ Ссылка