2011-04-18 44 views
0

我試圖在郵件列表(CSV格式)中找到具有特定郵政編碼的條目。 我認爲這應該工作,但它永遠找不到任何東西,儘管我知道郵政編碼在那裏。Python:在列表中找不到應該存在的值

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語句像他們應該是匹配的,而當我去殼牌和類型類似

93701 in KFCFzip 

它給我回「真:,所以它的工作到那個程度,該文件是文本用逗號分隔的,所以我想不通爲什麼它可以看到它們。 數據文件具有實時數據,所以我不得不在發佈之前對它進行一些修改,我想知道是否有人有任何想法不涉及發佈數據本身

回答

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倍(更快的讀取)。

+0

詛咒我的新手!我忘了int/string的區別。感謝一堆的建議。 – chrisfs 2011-04-18 21:16:26

+0

不客氣。祝你好運,學習Python;) – Elalfer 2011-04-18 22:18:58

+0

我正在努力。堆棧溢出是一個偉大的「幫助我卡住」的參考,我試圖謹慎使用。 – chrisfs 2011-04-18 23:17:48

1

這可能是一個字符串與整數問題。嘗試彌補你的array[6][0:5]或串行你的範圍。

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') 
+0

啊不知道拉鍊是內建的。每天學習新東西(有時不止一個) – chrisfs 2011-04-18 23:16:32

相關問題