Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在双循环python中仅打印一个_Python_Python 3.x_Loops - Fatal编程技术网

在双循环python中仅打印一个

在双循环python中仅打印一个,python,python-3.x,loops,Python,Python 3.x,Loops,我正在用Python制作一个搜索csv文件的工具。在最后几行代码中,我做了一个双循环: for letterText in Text: for letterBook in i: if letterText == letterBook: count = count + 1 if count >= countLetter/2: print(i.upper(),":",bookList[i].upper())

我正在用Python制作一个搜索csv文件的工具。在最后几行代码中,我做了一个双循环:

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
只打印一次
(I.upper(),“:”,bookList[I].upper())
。我不知道我做错了什么。谢谢你的帮助。这是完整的代码

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

我认为您的问题是
break
仅适用于内部循环(
适用于I:
中的信笺)。您需要将代码更改为也从外部循环中断(
用于Text:
)并将其放入
else
分支(如果Text==i:
)。您的代码似乎在检查部分文本匹配。为此,我建议您使用一些其他技术,如内置的,信息不多,但您可以使用来跟踪打印内容并检查它,下面是一个修改过的代码

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

代码的问题是有两个for循环,只有一个break语句

一旦
count>=countLetter/2
为true,就会打印
i.upper(),“:”,bookList[i].upper()
,然后调用break语句。break语句在i循环中中断了letterBook的
,但在Text
循环中没有中断letterText的
,因此该循环进入下一次迭代,依此类推

我经常使用标志变量来打破这种循环。像布尔变量这样的标志变量最初可能为false,但在
count>=countLetter/2
为true时将存储true,如果标志变量为true,则在
for letterText in Text
循环中执行另一个break语句

查看下面的代码:

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

编辑:还有一件我忘了看。您还将检查
如果Text==i
是否在
for(i)in bookList
循环中,如果这是真的,则必须继续到同一循环的下一次迭代,而不检查其余文本。因此,如果返回true,则添加一个
continue
语句以继续下一次迭代。

输入(“Book…”)
看起来如何?欢迎使用堆栈溢出!查看和。如果你提供了一个简单的答案,这将更容易回答。目前,您的示例不可复制,因为它缺少用户输入、CSV、输出和所需的输出。尽管如果你去掉输入和CSV,把它们静态地放在代码中,可能会更清楚。你是否在尝试查看任何键入的文本是否以任何方式与书名的一部分匹配。正如输入“是”会给我们所有包含“是”的书名一样@SamuelMiddendorp我正在尝试打印所有至少有一半或其文字与输入相等的书。