我從this答案注意到代碼創建一個Python列表理解與if和嵌套打破循環
for i in userInput:
if i in wordsTask:
a = i
break
可以寫成下列方式列表理解:
next([i for i in userInput if i in wordsTask])
我有一個類似的問題,那就是我想在列表理解方面編寫以下代碼(從原始問題簡化)代碼:
for i in xrange(N):
point = Point(long_list[i],lat_list[i])
for feature in feature_list:
polygon = shape(feature['geometry'])
if polygon.contains(point):
new_list.append(feature['properties'])
break
我希望每個point
都與功能列表中的單個多邊形關聯。因此,一旦找到包含該點的多邊形,將使用break
移動到下一個點。因此,new_list
將具有完全N
元素。
我寫它作爲一個列表理解如下:
new_list = [feature['properties'] for i in xrange(1000) for feature in feature_list if shape(feature['geometry']).contains(Point(long_list[i],lat_list[i])]
當然,這並沒有考慮到break
在if
聲明,因此需要顯著長於使用嵌套的for循環。從上面的鏈接使用後的意見(我可能不完全理解),我做了
new_list2 = next(feature['properties'] for i in xrange(1000) for feature in feature_list if shape(feature['geometry']).contains(Point(long_list[i],lat_list[i]))
然而,new_list2
具有比N個元素少得多(在我的情況,N=1000
和new_list2
只有5個元素)
問題1:它是否值得做這個列表理解?唯一的原因是我讀到列表推導通常比嵌套循環快一點。擁有200萬個數據點,每一秒都很重要。
問題2:如果是這樣,我會如何將break
聲明納入列表理解?
問題3:在我使用next
時,發生了什麼錯誤?
非常感謝您的寶貴時間和善意的幫助。
'next()'用於獲取第一個列表項,並有效地拋出列表的其餘部分。理想情況下,Python只會創建您要求的項目,如果您從未嘗試查看列表的其餘部分,則它從不計算。如果shape(feature ['geometry'))。contains(Point(long_list [i],lat_list [i])))for myrange()中,new_list3 = [next(feature ['properties'] for feature in list) 1000)]'? – TessellatingHeckler