2012-06-21 62 views
2

我試圖從名爲DEV_TYPE的字段中訪問表中的某些記錄進行遊標搜索。我想每個記錄比較反對知道值我剛纔在我的腳本內置的列表:在Python中使用'不是'

(devcatList)

我想打印出來沒有在列表中出現的任何值。記錄中的某些值也是Null。我想將我的if語句設置爲僅打印列表中未出現的值,但我也不想爲Null值打印出'None'。我的腳本如下:

if field.name == "DEV_TYPE": 
for iRow in arcpy.SearchCursor(fc): 
     if not iRow.DEV_TYPE is None or iRow.DEV_TYPE not in devcatList: 
      print str(iRow.OBJECTID) + " - " + str(iRow.DEV_TYPE) 

我受夠了「if not x is None」玩耍了以「if x is not None」。將'or'更改爲'and'(儘管它與直覺相反),但是我的打印輸出或者返回所有值或者沒有值,或者僅'None'....基本上我不想要的所有東西。我確定我在做一些愚蠢的事情。有人能指出我的愚蠢是什麼嗎?

謝謝, 邁克

+6

我想你想'如果iRow.DEV_TYPE不無和iRow.DEV_TYPE不devcatList:' –

+0

見,我知道我在做一些愚蠢的...我想我已經嘗試過。我再次從挫折中測試,它的工作原理。我一定錯過了。保羅,如果你提交這個答案,我會接受。謝謝, – Mike

+0

因爲你更關心包含排除測試('is'和'不''),我想你可能要考慮使用一個集合而不是一個列表。你可以用'devcatSet = set(devcatList)'輕鬆創建。這將提供O(1)性能而不是O(N)。 – JPvdMerwe

回答

4

我想你想if iRow.DEV_TYPE is not None and iRow.DEV_TYPE not in devcatList:

2

也許是這樣的:

if field.name == "DEV_TYPE": 
    for iRow in arcpy.SearchCursor(fc): 
     dev_type = iRow.DEV_TYPE 
     if dev_type is not None and dev_type not in devcatList: 
      print "{} - {}".format(iRow.OBJECTID, iRow.DEV_TYPE) 

if dev_type is not none可以更方便地(但不太精確)指出if dev_type因爲None相當於False在有條件的情況下。我還冒昧地以更加慣用的方式重寫了這些陳述。

+3

我會堅持''dev_type不是None'',因爲其他值(False,0等)可以評估爲False。 – jterrace

+0

@jterrace關於'不是None'的公平點更精確。使用簡單的'dev_type'就可以做出一些可能的假設,但不一定是真實的。編輯更精確/小心。感謝您的評論。 –

+0

感謝Jonathon的建議。我也測試了這一點,你是對的。在我的情況下,這也會起作用。 – Mike

相關問題