Python

Помогите с кодом питон

Понимаю, что код довольно плохой, но почему он 0 выводит?

s=open("C:\\Users\\zamin\\Downloads\\24_8431.txt").readlines()
k=-3
t=''
m=0
t=False
a=set()
for x1 in "XYZ":
for x2 in "XYZ":
for x3 in "XYZ":
s=x1+x2+x3
if s.count('X')==1 and s.count('Y')==1 and s.count('Z')==1:
a.add(s)
print(a)


for i in range(len(s)-2):
t=s[i]+s[i+1]+s[i+2]
if t in s:
k= -3
else:
k+=1
m=max(m,k)
print(m)
По-моему, тебя кто-то обманул. Денег хотя бы не платил за эту поделку? Этот код не вычисляет то, что тебе нужно.

В s сначала читаются строки (причём, все сразу в один список - вот будет сюрприз, если в файле гигабайт).
Потом s в каждой итерации цикла перетирается строкой, содержащей комбинацию из XYZ. В этот момент данные из файла уже потеряны. По завершении цикла s будет содержать последнюю комбинацию (ZZZ, не добавленную в множество).

Дальше идёт цикл по первому символу этой комбинации (т.е. пройдёт одна итерация). k будет присвоено значение -3+1=-2, т.к. в ZZZ нет всех трёх символов разделителя.
Ну, и дальше m = max(-2, 0) = 0.
Программа выводит ровно тот результат, вычисление которого ты запрограммировал. Причём, независимо от входных данных.

Заметим, что если исправить ошибку с перетиранием данных, прочитанных из файла, то всплывёт вторая ошибка, замаскированная первой. Второй цикл будет итерироваться по списку, а не по строке. Компилятор эту ошибку не найдёт, и на выходе по-прежнему останется 0.
ЭВ
Этк-2006 Василевич
87 571
Лучший ответ
Николай Бокарев Заплатил 23 минуты своей жизни. По идее то должен работать, вот рабочий код. Просто я хочу именно понять, что с моим кодом не так
 # читаем ОДНУ строку из файла и добавляем разделитель, который упрощает код
s = open(r'C:\Users\zamin\Downloads\24_8431.txt').readline() + 'XYZ'
mx, start = 0, 0
for i in range(len(s) - 2):
if set(s[i : i + 3]) == {'X', 'Y', 'Z'}:
mx, start = max(mx, i - start), i + 3
print(mx)
Равенство множеств не зависит от порядка элементов в множестве.
Д.
Денис .
59 192
Ваш код имеет несколько проблем, и я предполагаю, что вы хотите узнать количество уникальных троек "XYZ" в текстовом файле. Давайте разберемся с вашим кодом и исправим его. Вот исправленная версия вашего кода:
 filename = "C:\\Users\\zamin\\Downloads\\24_8431.txt" 

with open(filename) as f:
content = f.read()

k = -3
m = 0
a = set()

for x1 in "XYZ":
for x2 in "XYZ":
for x3 in "XYZ":
s = x1 + x2 + x3
if s.count('X') == 1 and s.count('Y') == 1 and s.count('Z') == 1:
a.add(s)

print(a)

for triple in a:
index = content.find(triple)
while index != -1:
k = -3
index = content.find(triple, index + 1)
else:
k += 1
m = max(m, k)

print(m)
Я изменил следующие вещи:

Заменил s=open("C:\\Users\\zamin\\Downloads\\24_8431.txt").readlines() на контекстный менеджер with open() as f для правильного открытия и закрытия файла.
Использовал f.read () вместо f.readlines(), так как вам нужно искать последовательности символов в одной строке, а не в разных строках.
Удалил переменную t, так как она не используется.
Заменил цикл for i in range(len(s)-2): на цикл for triple in a:, чтобы итерироваться по уникальным тройкам "XYZ".
Заменил проверку if t in s: на цикл while, который ищет вхождения троек в тексте, используя метод find().
Теперь код должен работать и выводить максимальное количество смежных уникальных последовательностей "XYZ", найденных в файле.