# Get Parameter Value by Name - Nested Lists

Does anyone know of an elegant way to get the Element.GetParameterValueByName to work with elements that are organized into nested lists?

See my example below:

My desired result is shown in red and should yield all 20s in a list format that matches the given element format.

Thanks!

A python script from a thread earlier this month would work:

Python:

``````"""
LIST : MATCH LEVELS
-
a dynamoPython script, visit the website for more details
https://github.com/Amoursol/dynamoPython
"""
__author__ = 'Kenzo Bird - birdkenzo@gmail.com'
__dynamoforum__ = 'Kennyb6'
__version__ = '1.0'

"""
Script to match structure of one list to another.
IN[0] must be completely flattened prior to this script.
Empty lists in either inputs may give unwanted results.
"""

def recCount(_lists, c):
# Count all elements in the structure list (IN[1])
for _list in _lists:
if isinstance(_list, list):
c = recCount(_list, c)
else:
c += 1
return c

def recMatch(_list, _matches, _out, c):
"""
Recreate the value list (IN[0]) according to the structure list (IN[1])
_list = entire value list
_matches = the current list level of the structure list
_out = value list matching the structure list to be passed on
c = count to be used as the current index of the value list
"""
for _match in _matches:
if isinstance(_match, list):  # if list, recurse another level deeper
outTemp, c = recMatch(_list, _match, [], c)
_out.append(outTemp)
else:
_out.append(_list[c])
c += 1
return _out, c

# Inputs:
mList = IN[0]  # List of values, flattened to single level
toMatch = IN[1]  # Original structured list
outList = []  # Need blank list to be appended, will be new value list
c = 0
mC = 0

# Checks that both lists are equal value to prevent invalid index errors
if len(mList) == recCount(toMatch, c):
OUT = recMatch(mList, toMatch, outList, mC)[0]
else:
in0Len = "IN[0] length = " + str(recCount(mList, c))
in1Len = "IN[1] length = " + str(recCount(toMatch, c))
OUT = ["List lengths do not match.", in0Len, in1Len]
``````

Note that you should flatten the input to GetParameterValueByName first.

2 Likes

Appreciated, this did the trick @kennyb6 !

You probably could have used Lacing or Levels to make this hope. Without another node.

Levels doesn’t work in this case, as far as I tested. If you can make it work, please show us.

Although no, I was not able to get levels to work, if you List.Map it I think would be a better option.

1 Like