Python:在应该存在的列表中找不到值

Python:在应该存在的列表中找不到值,python,Python,我试图在邮件列表(CSV格式)中查找带有特定邮政编码的条目。 我认为这应该行得通,但它从来没有找到任何东西,尽管我知道,追求邮政编码在那里 text = open("during1.txt","r") a = list(range(93201,93399)) b = list(range(93529,93535)) c = list(range(93601,93899)) d = list(range(95301,95399)) KFCFzip = a+b+c+d output = open("

我试图在邮件列表(CSV格式)中查找带有特定邮政编码的条目。 我认为这应该行得通,但它从来没有找到任何东西,尽管我知道,追求邮政编码在那里

text = open("during1.txt","r")
a = list(range(93201,93399))
b = list(range(93529,93535))
c = list(range(93601,93899))
d = list(range(95301,95399))
KFCFzip = a+b+c+d
output = open("output.txt","w")

for line in text:
    array= line.strip().split(",")
    print(array[6][0:5])
    if array[6][0:5] in KFCFzip:
        #output.write(array)
        print("yes")
text.close()
output.close()
当我运行代码时,它没有找到匹配项,但是IF语句上面的print语句打印出看起来应该匹配的值,当我转到Shell并键入类似的内容时

93701 in KFCFzip
它给了我“True:,所以在这个程度上它是工作的。这个文件只是用逗号分隔的文本,所以我不明白为什么它可以看到它们。
数据文件包含实时数据,因此我必须在发布之前对其进行一些更改。我想知道是否有人有任何不涉及发布数据本身的想法。

这可能是字符串与整数之间的问题。尝试初始化您的
数组[6][0:5]
或字符串化您的范围。

因为
数组[6][0:5]
是字符串。在查看
KFCFzip
列表之前,应将其转换为整数

for line in text:
    array= line.strip().split(",")
    print(array[6][0:5])
    if int(array[6][0:5]) in KFCFzip:
        print("yes")
此解决方案的另一个问题是性能。
range
创建元素列表,以便将每个“可疑”邮政编码与每个可能的邮政编码进行比较。此算法的时间复杂度为
O(n*m)
其中
n=len(KFCFzip)
和m-文件中的行数。更好的方法是创建一个范围列表,如:

KFCFzip = [[93201,93399], [93529,93535], [93601,93899], [95301,95399]]

for line in text:
    array= line.strip().split(",")
    zip = int(array[6][0:5]))
    print(zip)
    found = False
    for r in KFCFzip:
        if zip >= r[0] and zip < r[1]:
            found = True
            break
    if found:
        print("yes")
KFCFzip=[[9320193399]、[9352993535]、[9360193899]、[9530195399]]
对于文本中的行:
数组=line.strip().split(“,”)
zip=int(数组[6][0:5]))
打印(zip)
发现=错误
对于KFCFzip中的r:
如果zip>=r[0]且zip
在这种情况下,您可以显著提高性能


例如,使用您的数据,您将有
197+5+297+97=596
元素,因此对于每一行,您必须平均进行
596/2=298
比较。但使用我的算法,您将只有
8/2=4
比较,这将减少约75倍(读取速度更快).

您应该使用
csv
模块。您这样做的方式是,如果文件中的某个字段包含逗号,您就完了

此外,您不应该隐藏内置名称,如
zip
。给变量命名
array
似乎是错误的:首先,它指的是
列表
,而不是
数组
。它们不是一回事。其次,变量名称应该反映它们所指的内容,而不仅仅是它们所指的类型

import csv

KFCFzip = [[93201,93399], [93529,93535], [93601,93899], [95301,95399]]

with open('addresses.csv', 'r') as addressfile:
    for address in csv.reader(addressfile):
        zipcode = int(address[6][0:5])
        for lower, upper in KFCFzip:
            if lower <= zipcode < upper:
                print('yes')
                break
        else:
            print('no')
导入csv
KFCFzip=[[9320193399]、[9352993535]、[9360193899]、[9530195399]]
以open('addresses.csv','r')作为地址文件:
对于csv.reader(addressfile)中的地址:
zipcode=int(地址[6][0:5])
对于KFCFzip中的下部和上部:

如果我是新手,那就诅咒我吧!我忘了int/string的区别了。谢谢你的建议。我正在努力。Stack Overflow是一个很好的“Help I's Stick”参考,我尽量少用。啊,不知道zip是一个内置的。每天学习新东西(有时不止一个)