Finding the index of an element in nested lists in python

Question:

I am trying to get the index of an element in nested lists in python – for example [[a, b, c], [d, e, f], [g,h]] (not all lists are the same size).
I have tried using

strand_value= [x[0] for x in np.where(min_value_of_non_empty_strands=="a")]

but this is only returning an empty list, even though the element is present. Any idea what I’m doing wrong?

Asked By: biophys_chem

||

Answers:

def find_in_list_of_list(mylist, char):
    for sub_list in mylist:
        if char in sub_list:
            return (mylist.index(sub_list), sub_list.index(char))
    raise ValueError("'{char}' is not in list".format(char = char))

example_list = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h']]

find_in_list_of_list(example_list, 'b')
(0, 1)
Answered By: DainDwarf

suppose your list is like this:

lst = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g','h']]
list_no = 0
pos = 0
for x in range(0,len(lst)):
    try:
        pos = lst[x].index('e')
        break
    except:
        pass

list_no = x

list_no gives the list number and pos gives the position in that list

Answered By: Bhrigu Srivastava

You could do this using List comprehension and enumerate

Code:

lst=[["a", "b", "c"], ["d", "e", "f"], ["g","h"]]
check="a"
print ["{} {}".format(index1,index2) for index1,value1 in enumerate(lst) for index2,value2 in enumerate(value1) if value2==check]

Output:

['0 0']

Steps:

  • I have enumerated through the List of List and got it’s index and list
  • Then I have enumerated over the gotten list and checked if it matches the check variable and written it to list if so

This gives all possible output

i.e.)

Code2:

lst=[["a", "b", "c","a"], ["d", "e", "f"], ["g","h"]]
check="a"
print ["{} {}".format(index1,index2) for index1,value1 in enumerate(lst) for index2,value2 in enumerate(value1) if value2==check]

Gives:

['0 0', '0 3']

Notes:

  • You can easily turn this into list of list instead of string if you want
Answered By: The6thSense

does this suffice?

array = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h']]
for subarray in array:
    if 'a' in subarray:
        print(array.index(subarray), '-', subarray.index('a'))

This will return 0 – 0. First zero is the index of the subarray inside array, and the last zero is the ‘a’ index inside subarray.

Answered By: Miguel Rentes

Reworked Bhrigu Srivastava’s proposal:

def findinlst(lst, val):
    for x in range(0, len(lst)):
        try:
            pos = lst[x].index(val)
            return [x, pos]
        except:
            continue
    return [False, False]  # whatever one wants to get if value not found

arr = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h']]

findinlst(arr, 'b')
[0, 1]

findInLst(arr, 'g')
[2, 0]

findinlst(arr, 'w')
[False, False]
Answered By: Yerbol Sapar

You can implement your own findIndex function, this looks like Javascipt’s Array.prototype.findIndex

def findIndex(callback, list):
    for index, element in enumerate(list):
        if callback(element):
            return index
    return -1
Answered By: Hef

A little bit of "amateur" approach and yet very easy to understand:

Creating a flag boolean value that will execute the result based on if it is True or False with a nested for loop.

entry=input()
listtt=[["a","b","c"],["d","e","f"],["g","h"]]
found=False
for sublist in listtt:
    for charr in sublist:
        if entry==charr:
            print(f"'{entry}' found in sublist {listtt.index(sublist)} with index {sublist.index(charr)}")
            found=True
            break
if found==False:
    print(f"'{entry}' not found")
Answered By: ddoch003

Expanding on DainDwarf’s answer, this will return multiple values if the searched item is in more than one of the nested lists:

def find_in_list_of_list(mylist, char):
    found_list = []
    for sub_list in mylist:
        if char in sub_list:
            found_list.append(f'({mylist.index(sub_list)}, {sub_list.index(char)})')
    if len(found_list) > 0:
        return found_list


example_list = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h'], ['a', 'b', 'c', 'd']]

print(find_in_list_of_list(example_list, 'c'))

I also got en error when changing the search from ‘b’ to ‘x’ in Dwarf’s code:

Traceback (most recent call last):
  File "C:main.py", line 9, in <module>
    print(find_in_list_of_list(example_list, 'x'))
  File "C:main.py", line 5, in find_in_list_of_list
    raise ValueError("'{char}' is not in list".format(char = char))
ValueError: 'x' is not in list
Answered By: Sabatino Ognibene
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.