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

时间:2011-04-18 19:31:38

标签: 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("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

它让我回到了“真:所以它在那个程度上起作用。文件只是用逗号分隔的文本,所以我无法弄清楚为什么它可以看到它们。 数据文件包含实时数据,因此我必须在发布之前稍微更改一下。我想知道是否有人有任何想法不涉及发布数据本身。

3 个答案:

答案 0 :(得分:7)

因为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")

此解决方案的另一个问题是性能。 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")
在这种情况下,你可以大大提高性能。

例如,使用您的数据时,您会有197+5+297+97 = 596个元素,因此对于每一行,您必须平均进行596/2 = 298次比较。但是使用我的算法,你只会进行8/2 = 4次比较,这比较少75次(读得更快)。

答案 1 :(得分:2)

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

此外,您不应隐藏内置名称,例如zip。命名变量 array 似乎是错误的:首先,它指的是list,而不是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')

答案 2 :(得分:1)

这可能是字符串与整数的问题。尝试通知你的array[6][0:5]或字符串。