python: найдите элементы в подсписках

#python #nested-lists #sublist

Вопрос:

учитывая эти подсписки

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

Я пытаюсь найти расположение его элементов,
например, буква » а » расположена на 0,0
, но эта строка

 print(lst.index('a'))
 

вместо этого возникает следующая ошибка:
Ошибка значения: «a» нет в списке

Комментарии:

1. print(lst[0].index('a')) ?

2. @diggusbickus что делать, если «а» нет в 0-м подсписке?

3. метод индекса выглядит в списке, который вы ему даете, а не в подсписках внутри. Вы можете перебирать свои подсписки (в случае, если » а «нет (только) в первом подсписке), и из результата вы должны знать, есть ли в нем «а»

4. проблема с вашим решением заключается в том, что мне придется вручную изменять параметр в зависимости от буквы, что означает, что я уже знаю, в каком подсписке содержится интересующий меня элемент.

5. Я так не думаю, может быть, со специальными библиотеками. Но я думаю, что они тоже будут использовать для циклов

Ответ №1:

если у вас list есть depth=2 , вы можете использовать это:

 lst=[['a', 'b', 'c', 'd', 'e'], ['f', 'g', 'h']]
def fnd_idx(char, lst):
    for x in range(len(lst)):
        try:
            idx = lst[x].index(char)
            return [x,idx]
        except ValueError:
            pass
    return None
 

Выход:

 >>> print(fnd_idx('a', lst))
[0, 0]

>>> print(fnd_idx('g', lst))
[1, 1]

>>> print(fnd_idx('z', lst))
None
 

Комментарии:

1. Вместо len оператора for вы можете напрямую перебирать подсписки: for sublist in lst: idx = sublist.index('a') с помощью try (я слишком ленив, извините =) )

2. @Metapod и как найти индекс? OP хочу [0,0]

3. Это зависит от того, может ли быть несколько вхождений » а » или нет. Если нет, то ваш метод работает. Если их может быть много, мы могли бы представить, что pos даст индекс в соответствующем подсписке того же индекса. В этом примере pos = [0, None] (подсписок 0 : «a» с индексом 0, подсписок 1: без «a»)

Ответ №2:

Вы можете использовать понимание списка:

 >>> lst=[['a', 'b', 'a', 'd', 'a'], ['f', 'g', 'a'], ['a','a','b']]
>>> [(i,j) for i in range(len(lst)) for j in range(len(lst[i])) if lst[i][j]=='a']
[(0, 0), (0, 2), (0, 4), (1, 2), (2, 0), (2, 1)]
 

Ответ №3:

Попробуйте эту функцию (всего одна строка кода!):

 def idx(lst, el):
    return next(((i, sublst.index(el))
                 for i, sublst in enumerate(lst)
                 if el in sublst),
                None)
 

Так, например:

 >>> idx(lst, 'a')
(0, 0)
>>> idx(lst, 'c')
(0, 2)
 

Ответ №4:

 lst=[['a', 'b', 'c', 'd', 'c'], ['f', 'g', 'h']]
searchvalue = 'f'
counter = 0
for index in lst:
    if searchvalue in index:
       print(counter, index.index(searchvalue))
    counter =1
 

Ответ №5:

Если » а » может отображаться в нескольких подсписках, и вам нужен индекс в каждом подсписке:

 def GetIndexes(lst, val):
    pos = []
    for sublist in lst:
        try:
            idx = sublist.index(val)
            pos.append(idx)
        except:
            pos.append(None)
    return pos
 

В вашем примере : [0, None]
Значение: В подсписке 0 первая буква » а » находится в индексе 0. В подсписке 1 нет «а».

Ответ №6:

вы можете сделать это с помощью numpy, преимущество в том, что вам не нужно ничего жестко кодировать для размера вложенных списков. у вас может быть сотни или 3, и это сработает!

 lst=[['a', 'b', 'c', 'd', 'e'], ['f', 'g', 'h']]
arr = np.array(lst, dtype=object)

for x in arr:
    try:
        print (x.index('a'), x)
    except:
        pass