I need to get a list of field names that only includes editable fields and not the geometry field, but then add the geometry field back to the end of the list as SHAPE@ token. I have code that runs successful, but I am horrible with List Comprehensions and I am sure there is something better out there.

update_fieldsED = [f for f in fields if f.editable]
update_fieldsNoShape = [fNS.name for fNS in update_fieldsED if fNS.type not in ["Geometry"]]

Is there a more compact way to achieve this?

closed as primarily opinion-based by Midavalo Jul 14 '17 at 19:50

Many good questions generate some degree of opinion based on expert experience, but answers to this question will tend to be almost entirely based on opinions, rather than facts, references, or specific expertise. If this question can be reworded to fit the rules in the help center, please edit the question.

  • 1
    What is wrong with what you're doing? There is no inefficiency. Are you having trouble with it, or is something not working? List Comprehension isn't going to make your code quicker or better, it just makes it more compact. I believe this comes at the expense of some readability particularly for someone fair new to python. – Midavalo Jul 14 '17 at 19:52
  • Would changing 'better' to 'more compact' make this less "opinion-based"? I dont know how that wouldnt be a valid question. – Rex Jul 18 '17 at 19:51
  • possibly, although I still also believe you should include some info on why you're trying to do it, what the end goal is, what has caused you to look for this answer. Are you having trouble or hit a problem you need to have solved? – Midavalo Jul 18 '17 at 20:26

Here's an easy way:

fields = arcpy.ListFields('//path/to/layer')
flds = [f.name for f in fields if f.editable and f.type != "Geometry"] + ["SHAPE@"]

Not the answer you're looking for? Browse other questions tagged or ask your own question.