Печать только один в двойном l oop python - PullRequest
0 голосов
/ 21 января 2020

Я создаю инструмент поиска с Python для файла CSV. В последних строках кода я делаю двойной l oop:

for letterText in Text:
    for letterBook in i:
        if letterText == letterBook:
            count = count + 1
        if count >= countLetter/2:
            print(i.upper(),":",bookList[i].upper())
            break

Но проблема в том, что я хочу печатать (i.upper(),":",bookList[i].upper()) только один раз за i. Я не могу понять, что я делаю неправильно. Спасибо за помощь. Вот полный код.

import csv
Text = input("Book...")
data = open(r"C:\Users\file.csv")
dataReader = csv.reader(data, delimiter = ";")
count = 0
countLetter = 0
bookList= dict()
letterList= list()

for letterText in Text:
    letterList.append(letterText)
    countLetter = countLetter + 1

for row in dataReader:
    bookList[row[0]]= row[1]

for (i) in bookList:
    for letterBook in i:
        LetterBookList = list(letterBook)
    count = 0
    #exact book name typed
    if Text == i:
        print(i.upper(),":",bookList[i].upper())
    for letterText in Text:
        for letterBook in i:
            if letterText == letterBook:
                count = count + 1
            if count >= countLetter/2:
                print(i.upper(),":",bookList[i].upper())
                break

Ответы [ 3 ]

0 голосов
/ 21 января 2020

Не так много информации, но вы можете использовать набор , чтобы отслеживать то, что вы напечатали, и проверить его, вот модифицированный код

printed = set()
for letterText in Text:
    for letterBook in i:
        if letterText == letterBook:
            count = count + 1
        if count >= countLetter/2 and i not in set:
            print(i.upper(),":",bookList[i].upper())
            printed.add(i)
            break
0 голосов
/ 21 января 2020

Проблема с вашим кодом в том, что у вас есть два для циклов и только один оператор break.

Если значение count >= countLetter/2 равно true, печатается i.upper(),":",bookList[i].upper() и вызывается оператор break. Оператор break выходит за пределы for letterBook in i l oop, но не выходит за пределы for letterText in Text l oop, и поэтому этот l oop переходит на следующую итерацию и т. Д.

Я часто использую переменные-флаги для выхода из таких циклов. Переменная flag, такая как логическая переменная, может изначально иметь значение false, но будет хранить true, если count >= countLetter/2 имеет значение true, и если переменная flag имеет значение true, в for letterText in Text l oop выполняется

. Проверьте код ниже:

import csv
Text = input("Book...")
data = open(r"C:\Users\file.csv")
dataReader = csv.reader(data, delimiter = ";")
count = 0
countLetter = 0
bookList= dict()
letterList= list()

for letterText in Text:
    letterList.append(letterText)
    countLetter = countLetter + 1

for row in dataReader:
    bookList[row[0]]= row[1]

for (i) in bookList:
    for letterBook in i:
        LetterBookList = list(letterBook)
    count = 0
    #exact book name typed
    halfThresholdReached = False
    if Text == i:
        print(i.upper(),":",bookList[i].upper())
        continue

    for letterText in Text:
        for letterBook in i:
            if letterText == letterBook:
                count = count + 1
            if count >= countLetter/2:
                print(i.upper(),":",bookList[i].upper())
                halfThresholdReached = True
                break
        if halfThresholdReached:
            break

РЕДАКТИРОВАТЬ: Есть еще одна часть, которую я забыл посмотреть. Вы также проверяете, есть ли if Text == i в for (i) in bookList l oop, и если это так, то вы должны перейти к следующей итерации того же l oop и не проверять оставшуюся часть Text . Поэтому, если он возвращает true, добавьте оператор continue, чтобы перейти к следующей итерации.

0 голосов
/ 21 января 2020

Я думаю, что ваша проблема в том, что break работает только для внутреннего l oop (for letterBook in i:). Вам нужно изменить свой код так, чтобы он также отделился от внешнего l oop (for letterText in Text:) и поместил его в else ветвь if Text == i:. Ваш код, кажется, проверяет частичное совпадение текста. Для этого я бы рекомендовал использовать некоторые другие методы, такие как встроенный difflib

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...