<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: UpdateCursor with nested loops and SelectLayerByAttributes in Python Questions</title>
    <link>https://community.esri.com/t5/python-questions/updatecursor-with-nested-loops-and/m-p/624935#M48728</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;First off cursors can be created with a query so selecting by attributes to run a cursor on the selection is 100% redundant. How big are your singleList and dupList variables? Those seem like where the biggest bottleneck using your code would be.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 30 Apr 2013 12:26:37 GMT</pubDate>
    <dc:creator>MathewCoyle</dc:creator>
    <dc:date>2013-04-30T12:26:37Z</dc:date>
    <item>
      <title>UpdateCursor with nested loops and SelectLayerByAttributes</title>
      <link>https://community.esri.com/t5/python-questions/updatecursor-with-nested-loops-and/m-p/624934#M48727</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I need to update fields in a feature class based on values from another feature class (with different geometry). Some of the features have multiple values and are handled in a separate loop to the other values. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have hacked something together that works with my test data, but using multiple SelectLayerByAttribute to get values from the other feature class makes it run much slower than I think it should. There must be a Python data structure I can use instead (like a dictionary with FID as key and LandCover as value) that will be faster and make my code more 'Pythonic'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Any suggestions appreciated!&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="plain" name="code"&gt;
with arcpy.da.UpdateCursor(paddock, fields) as cursor:
&amp;nbsp;&amp;nbsp;&amp;nbsp; for row in cursor:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print row
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in singleList:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print i
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if row[0] == i[0]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.SelectLayerByAttribute_management(fc, "NEW_SELECTION", """"FID" = {0}""".format(i[0]))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; landCover = list(r.LandCover for r in arcpy.SearchCursor(fc))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print "updating.... " + landCover[0]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; row[1] = landCover[0]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cursor.updateRow(row)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in dupList:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print i
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if row[0] == i[0]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.SelectLayerByAttribute_management(fc, "NEW_SELECTION", """"FID" = {0}""".format(i[0]))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; landcoverList = list((r.LandCover,r.Shape_Area) for r in arcpy.SearchCursor(fc))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; maxlandCover = max(landcoverList, key=lambda x: x[1])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; landCover = list(maxlandCover)[0]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print "updating.... " + landCover
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; row[1] = landCover
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cursor.updateRow(row)&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Matt&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 30 Apr 2013 07:02:17 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/updatecursor-with-nested-loops-and/m-p/624934#M48727</guid>
      <dc:creator>MatthewBrown1</dc:creator>
      <dc:date>2013-04-30T07:02:17Z</dc:date>
    </item>
    <item>
      <title>Re: UpdateCursor with nested loops and SelectLayerByAttributes</title>
      <link>https://community.esri.com/t5/python-questions/updatecursor-with-nested-loops-and/m-p/624935#M48728</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;First off cursors can be created with a query so selecting by attributes to run a cursor on the selection is 100% redundant. How big are your singleList and dupList variables? Those seem like where the biggest bottleneck using your code would be.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 30 Apr 2013 12:26:37 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/updatecursor-with-nested-loops-and/m-p/624935#M48728</guid>
      <dc:creator>MathewCoyle</dc:creator>
      <dc:date>2013-04-30T12:26:37Z</dc:date>
    </item>
    <item>
      <title>Re: UpdateCursor with nested loops and SelectLayerByAttributes</title>
      <link>https://community.esri.com/t5/python-questions/updatecursor-with-nested-loops-and/m-p/624936#M48729</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;There are two bottlenecks in your code. You pointed out first which is calling arcpy.SelectLayerByAttribute_management multiple times, other is creating new arcpy.SearchCursor(fc) object for each matched FID.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Your idea with dict is good. Below is code with more generic solution, which iterates through feature class and creates dictonary where key is FID and value is another dictionary that maps fieldname to its value for each row.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
fields = [f.name for f in arcpy.ListFields(fc) if f.name.upper() not in ('FID', 'SHAPE')]
collector = arcpy.SearchCursor(fc)
data = {}
for feature in collector:
&amp;nbsp;&amp;nbsp;&amp;nbsp; data[feature.FID] = {f: feature.getValue(f) for f in fields}
del collector
&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Getting LandCover field value from this would be:&lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;LandCover = data[i[0]]['LandCover']&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;You can simplify this to get only LandCover value - in this case I would suggest using arcpy.da.SearchCursor instead of arcpy.SearchCursor because of its efficiency. So it would be something like:&lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
data = {}
with arcpy.da.SearchCursor(fc, ['FID', 'LandCover']) as collector:
&amp;nbsp; for row in collector:
&amp;nbsp;&amp;nbsp;&amp;nbsp; data[row[0]] = row[1]
&lt;/PRE&gt;&lt;BR /&gt;&lt;SPAN&gt;Then getting value of LandCover field would be:&lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;LandCover = data[i[0]]&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Hope it help.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Arek&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 12 Dec 2021 02:37:41 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/updatecursor-with-nested-loops-and/m-p/624936#M48729</guid>
      <dc:creator>ArkadiuszMatoszka</dc:creator>
      <dc:date>2021-12-12T02:37:41Z</dc:date>
    </item>
    <item>
      <title>Re: UpdateCursor with nested loops and SelectLayerByAttributes</title>
      <link>https://community.esri.com/t5/python-questions/updatecursor-with-nested-loops-and/m-p/624937#M48730</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;BLOCKQUOTE class="jive-quote"&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
fields = [f.name for f in arcpy.ListFields(fc) if f.name.upper() not in ('FID', 'SHAPE')]
collector = arcpy.SearchCursor(fc)
data = {}
for feature in collector:
&amp;nbsp;&amp;nbsp;&amp;nbsp; data[feature.FID] = {f: feature.getValue(f) for f in fields}
del collector
&lt;/PRE&gt;&lt;BR /&gt;&lt;/BLOCKQUOTE&gt;&lt;BR /&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi Arek,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Looks like getValue() was a major piece of the puzzle that I was missing!&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I will try to implement this later and post back.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Matt&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 12 Dec 2021 02:37:44 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/updatecursor-with-nested-loops-and/m-p/624937#M48730</guid>
      <dc:creator>MatthewBrown1</dc:creator>
      <dc:date>2021-12-12T02:37:44Z</dc:date>
    </item>
  </channel>
</rss>

