def processFeature(feature):
    x = feature.getAttribute('_list{}.item')
Â
    for i in range(0,len(x)):
        _i = str(i)
        val = feature.getAttribute('_list{'+_i+'}.item')
        y = str(val)+'__'
        feature.setAttribute('_list{'+_i+'}.item',y)
Â
The above will append '__' to the end of each item in the list.
Â
A couple of things to note with your code, len(x) returns an int, ints aren't iterable, by placing it in range() we get a list which can be iterated overÂ
Â
You need to indiviually update each item in the list using setAttribute()
def processFeature(feature):
    x = feature.getAttribute('_list{}.item')
Â
    for i in range(0,len(x)):
        _i = str(i)
        val = feature.getAttribute('_list{'+_i+'}.item')
        y = str(val)+'__'
        feature.setAttribute('_list{'+_i+'}.item',y)
Â
The above will append '__' to the end of each item in the list.
Â
A couple of things to note with your code, len(x) returns an int, ints aren't iterable, by placing it in range() we get a list which can be iterated overÂ
Â
You need to indiviually update each item in the list using setAttribute()
Sorry, the len(x) was an oversight in my example writing.Â
Does this work if the output list is shorter than the current list? For example if I am using x.pop(_i) for some values, the items at the end of the list may be missed.
You can use this syntax to set the list, you don't necessarily need to iterate
feature.setAttribute("list{}.item", x)
But are you actually changing x in your code, before you use it to set the list attribute, e.g.
def processFeature(feature):
    x = feature.getAttribute('list{}.startIndex')
    x = istr(i)+"_test" for i in x]
    feature.setAttribute('list{}.startIndex', x)
Â
Â
Â
Â
Â
Sorry, the len(x) was an oversight in my example writing.Â
Does this work if the output list is shorter than the current list? For example if I am using x.pop(_i) for some values, the items at the end of the list may be missed.
in that case you could do something like this (exclude when list val = 2).
if your input is ("1","2","3","4","5"], your output will be "1__","3__","4__","5__"]
import fme
import fmeobjects   Â
Â
def processFeature(feature):
    x = feature.getAttribute('_list{}.item')
    new = e]
   Â
    for i in range(0,len(x)):
        _i = str(i)
        val = feature.getAttribute('_list{'+_i+'}.item')
        if val == 2:
            pass
        else:
            y = str(val)+'__'
            new.append(y)
Â
    feature.setAttribute('_newList{}.item',new)
Â
You can use this syntax to set the list, you don't necessarily need to iterate
feature.setAttribute("list{}.item", x)
But are you actually changing x in your code, before you use it to set the list attribute, e.g.
def processFeature(feature):
    x = feature.getAttribute('list{}.startIndex')
    x = istr(i)+"_test" for i in x]
    feature.setAttribute('list{}.startIndex', x)
Â
Â
Â
Â
Â
Yea, you can also iterate over the list natively, in this case it is better to do your (@ebygomm​ ) approach (went the range()/len() approach as @lukehicks​ initial code include the len() of the input list)
For what it's worth, I prefer to use the enumerate function when iteration with for statement is required.
Example: Assign value of "_list{N}.item" to new attribute "_item_N"
        items = feature.getAttribute('_list{}.item')
        for i, v in enumerate(items):
            feature.setAttribute('_item_%d' % i, v)
Â