পাইথন তালিকায় যদি বৈশিষ্ট্য দ্বারা বৈশিষ্ট্য নির্বাচন করা হয়?


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,)ফলে এসকিউএল সিন্ট্যাক্স ত্রুটি হয়।

আরও জেনেরিক এক্সপ্রেশন যা শূন্য বা একটি আইটেমকেও পরিচালনা oid_listকরবে:

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

আমি আর্কজিআইএস নির্বাচন ইন্টারফেস 'IN' সমর্থিত বুঝতে পারি নি। এটি আমার সমাধানের চেয়ে সম্ভবত আরও দক্ষ।
এএইচইইজি

1
কেবল সতর্ক থাকুন একটি উচ্চতর সীমা রয়েছে যা IN ক্যোয়ারী দ্বারা সমর্থিত আমি মনে করি এটি 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 ব্যবহার করতে পারেন এমনকি কোনও বৈশিষ্ট্য না থাকলেও এটি প্রথম পুনরাবৃত্তিতে একটি নতুন নির্বাচন তৈরি করবে।

সম্পাদনা:

আপনি যদি ভাবেন যে আলাদা আলাদা সিলেক্টলায়ারবাইট্রিবিউট করার ব্যয় খুব বেশি হবে আপনি নিজের তালিকার দৈর্ঘ্যের উপর নির্ভর করে যেখানে আপনি বেশ বড় একটি নির্বাচনের ধারাটি তৈরি করেন আপনি এই জাতীয় একটি পদ্ধতির ব্যবহার করতে পারেন:

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" =' + স্ট (এক্স) + 'বা' কিউ = ক্যু = কিউ [1: -4] এবং তারপরে সিলেক্টব্যাট্রিবিউট। মনে হচ্ছে কাজ!
jsnider

আমি আমার উত্তরটি আপনার নির্বাচিত পদ্ধতির সাথে আপডেট করব যাতে এটি পার্স করা যায় এবং পড়া সহজ হয়। খুশী এটা কাজ করে।
এএইচইইজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.