Searching For An Element Inside A Multi-dimensional List And To Return The Sub-list Number?
Previously I had a question on finding whether an element exists in a nested list or not and got the response in the below link. Search of Element inside a multi-dimensional List N
Solution 1:
Since your original function can deal with much more complicated nested structures than just lists of lists, so should your nested 'index' function:
def in_nested_list(item, x):
if item == x:
return []
if isinstance(x, list):
for i, ix in enumerate(x):
r = in_nested_list(item, ix)
if r != -1:
return [i] + r # highest level index plus path in sublist
return -1 # not found in any (nested) sublist
# if not found at all: return -1
# if item == x: return []
# else: return [a, b, c] such that item == x[a][b][c]
> in_nested_list(3, [[1, 2], [3, 4]])
[1, 0]
> in_nested_list(3, [[1, 2], [[5, 3], 4]])
[1, 0, 1]
> in_nested_list(3, 3)
[]
> in_nested_list(3, [1, 2])
# -1
This allows you to append stuff at any nesting level of your choosing. As for your question, the index of the sublist in your simple structure would be in_nested_list(...)[0] (if present, raises Error otherwise).
Solution 2:
I took leverage to modify your function.
def in_nested(item, container):
if not isinstance(container, list):
raise TypeError
for elem in container:
if isinstance(elem, list):
found = in_nested(item, elem)
if not found:
pass
elif isinstance(found, bool):
# Item is present in this list
return elem
# List containing item is present in this container
# Comment above return to use it.
return container
else:
# Return the deepest list and not the most outer list containing it.
return found
else:
return item == elem
_input = [[['red'], ['blue'], ['bla']], [['hello'], ['blue'], ['bla']]]
out = in_nested('hello', _input)
if out:
print "Found Hello", out
else:
print "Not Found Hello"
out.append('new')
print 'Added new to original input', _input
out = in_nested('Hello', _input) # hello with capital H
if out:
print "Found Hello", out
else:
print "Not Found Hello"
# Prints:
# Found Hello ['hello']
# Added new to original input [[['red'], ['blue'], ['bla']], [['hello', 'new'], ['blue'], ['bla']]]
# Not Found Hello
Note: It gives you the target list itself, if item is present else None. You don't have to locate the list again. Just append to the result.
Post a Comment for "Searching For An Element Inside A Multi-dimensional List And To Return The Sub-list Number?"