我试图在邮件列表(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()
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,它找不到匹配项,但IF语句上方的print语句打印出看起来应该匹配的值,当我转到Shell并键入类似的内容时
93701 in KFCFzip
Run Code Online (Sandbox Code Playgroud)
它给了我"真的:,所以它的工作就是这么大.文件只是用逗号分隔的文本,所以我无法弄清楚为什么它可以看到它们.数据文件有实时数据,所以我不得不改变在发布之前,我有点想知道是否有人有任何不涉及发布数据的想法.
因为array[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")
Run Code Online (Sandbox Code Playgroud)
该解决方案的另一个问题是性能.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")
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可以显着提高性能.
例如,使用您的数据,您将拥有197+5+297+97 = 596元素,因此对于每条线,您必须596/2 = 298平均进行比较.但是使用我的算法你只会8/2 = 4进行比较,这比较少75倍(阅读速度更快).