यदि पायथन सूची में विशेषता द्वारा सुविधाओं का चयन?


14

मैं पायथन में विशेषता के आधार पर एक चयन को पूरा करने की कोशिश कर रहा हूं, लेकिन इस सूची के आधार पर कि क्या कोई विशेषता सूची में मौजूद है।

इस तरह की क्वेरी सबसे सरल होनी चाहिए:

qry = " \"OBJECTID\" in oid_list"
arcpy.SelectLayersByAttribute_management(inft, "NEW_SELECTION", qry)

लेकिन वह दृष्टिकोण अमान्य अभिव्यक्ति त्रुटि देता है।

अतीत में, मुझे इस प्रकार के क्वेरी के लिए अधिक जटिल साइटैक्स का उपयोग करना पड़ा है, जैसे:

sqlQuery2 = "nid in (" + ','.join(["'"+x+"'" for x in delta_list]) +")"

लेकिन इस स्निपेट का एक रूपांतरण मेरे लिए भी काम नहीं करता है, अर्थात:

 "OBJECTID_1 in (" + ','.join(["'"+str(x)+"'" for x in oid_list]) +")"

मुझे यहां क्या समझ नहीं आ रहा है?

जवाबों:


16

पूर्णांक की सूची के लिए आपकी मूल क्वेरी को संशोधित किया जा सकता है:

'"OBJECTID_1" IN ' + str(tuple(oid_list))

यदि ऐसा है oid_list = [7, 9, 4, 8], तो परिणाम है:

"OBJECTID_1" IN (7, 9, 4, 8)

ध्यान रखें कि यह "चाल" काम करता है यदि oid_listहमेशा दो या अधिक आइटम होते हैं, चूंकि अन्य मान्य ट्यूपल्स, जैसे ()या (7,), SQL सिंटैक्स त्रुटि के साथ परिणाम देगा।

एक अधिक सामान्य अभिव्यक्ति जो शून्य या एक oid_listआइटम को भी संभालती है:

'"OBJECTID_1" IN ({0})'.format(', '.join(map(str, oid_list)) or 'NULL')

मुझे आर्कजीआईएस के चयन इंटरफेस का एहसास नहीं हुआ जो 'IN' को सपोर्ट करता है। यह शायद मेरे समाधान से अधिक कुशल है।
AHigh

1
बस सावधान रहें एक ऊपरी सीमा है जो आईएन क्वेरी द्वारा समर्थित है मुझे लगता है कि यह 2000 रिकॉर्ड है
ट्रिस्टन फॉरवर्ड

9

इस उत्तर में फ़ंक्शन का थोड़ा संशोधित संस्करण है , अर्धविराम-सीमांकित स्ट्रिंग के बजाय पायथन सूची को स्वीकार करने के लिए:

def buildWhereClauseFromList(table, field, valueList):
    """Takes a list of values and constructs a SQL WHERE
    clause to select those values within a given field and table."""

    # Add DBMS-specific field delimiters
    fieldDelimited = arcpy.AddFieldDelimiters(arcpy.Describe(table).path, field)

    # Determine field type
    fieldType = arcpy.ListFields(table, field)[0].type

    # Add single-quotes for string field values
    if str(fieldType) == 'String':
        valueList = ["'%s'" % value for value in valueList]

    # Format WHERE clause in the form of an IN statement
    whereClause = "%s IN(%s)" % (fieldDelimited, ', '.join(map(str, valueList)))
    return whereClause

6

मुझे लगता है कि इसके लिए सबसे सरल दृष्टिकोण आपकी सूची में मूल्यों के माध्यम से विलक्षण रूप से पुनरावृत्ति करना और उन्हें चयन में जोड़ना है (ताकि आप सूची में प्रत्येक मान के साथ अपनी क्वेरी को बदल सकें)। कुछ इस तरह:

oidList = [1,2,3,4]
arcpy.management.MakeFeatureLayer(thisFC,thisLyr)
for values in oidList:
    query = "\"OBJECTID\"="+str(values)
    arcpy.management.SelectLayerByAttribute(thisLyr,"ADD_TO_SELECTION",query)

आप ADD_TO_SELECTION का उपयोग कर सकते हैं भले ही कोई सुविधाएँ चयनित न हों, यह पहले पुनरावृत्ति पर एक नया चयन बनाएगा।

संपादित करें:

यदि आपको लगता है कि अलग-अलग SelectLayerByAttribute करने की लागत बहुत अधिक होगी, तो आप इस तरह से एक दृष्टिकोण का उपयोग कर सकते हैं जहां आप अपनी सूची की लंबाई के आधार पर एक बहुत बड़ा चयन खंड बनाते हैं:

oidList = [1,2,3,4]
arcpy.management.MakeFeatureLayer(thisFC,thisLyr)
query=""
q=""
oidList.sort()
for x in oidList:
    query="\"OBJECTID\"="+str(x)+" OR "+q
    q=query
q=q[1:-4]
arcpy.management.SelectLayerByAttribute(thisLyr,"NEW_SELECTION",q)

मूल्यों के माध्यम से पुनरावृति करने के लिए दिलचस्प विचार और प्रत्येक पुनरावृत्ति के लिए विशेषता द्वारा चयन करें। मैं इसका परीक्षण करूँगा, लेकिन मुझे पूरा यकीन है कि यह काम करना चाहिए। धन्यवाद।
jsnider

यह काम करता प्रतीत होता है, लेकिन निश्चित रूप से कुछ सूचियों को लंबी सूची के लिए संसाधित करने में कुछ समय लगेगा।
jsnider

2
एक अलग दृष्टिकोण के साथ उत्तर को अपडेट करें।
एही जूल

अद्यतन उत्तर के साथ अच्छा विचार है। मैंने इस दृष्टिकोण का उपयोग करने के लिए चुना है क्योंकि यह बड़ी सूचियों को संसाधित करने के लिए बहुत तेज़ है। थोड़ा संशोधित: q = "" x के लिए oid_set में: क्वेरी = '"OBJECTID_1" =' + str (x) + 'या' q = क्वेरी q = q [1: -4] और फिर selectbyattribute। काम करने लगता है!
१२:५२

मैं आपके उत्तर को आपके चुने हुए दृष्टिकोण से अपडेट करूँगा ताकि यह पढ़ने में आसान और आसान हो। खुशी है कि यह काम किया।
जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.