Как я могу проиндексировать одно значение из списка, содержащего подсписки в python?

#python #list #indexing

#python #Список #индексирование

Вопрос:

В качестве примера, прямо сейчас у меня есть список:

 list = [[1276, 'c'], [910, 'b'], [819, 'o'], [759, 'z'], [699, 'l']]
  

и я хотел бы проиндексировать этот список только для определенной буквы, например:

 index = list.index('c')
  

Как есть, я понимаю, что я собираюсь получить ValueError , и я узнал, что для того, чтобы это сработало, мне нужно было бы проиндексировать весь подсписок.

 index = list.index([1276,'c'])
  

Могу ли я каким-либо образом обойти необходимость индексирования списка в целом, учитывая, что в настоящее время я не знаю целочисленного значения?

Я надеюсь, что все это имеет смысл, и при необходимости я, безусловно, могу предоставить дополнительные разъяснения.

Спасибо

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

1. Вы могли бы выполнить итерацию по списку списков и создать словарь индексов для каждого элемента, а затем использовать словарь. функция enumerate() может оказаться полезной.

Ответ №1:

Если вы знаете, что внутренние списки будут иметь только два значения, вы могли бы создать свою собственную функцию, чтобы получить первый элемент, который совпадает с next() и enumerate() :

 def get_index(lst, item):
    return next((i for i, (_, x) in enumerate(lst) if x == item), None)
  

Который работает следующим образом:

 print(get_index(lst, 'c')) # 0
print(get_index(lst, 'b')) # 1
print(get_index(lst, 'o')) # 2
print(get_index(lst, 'z')) # 3
print(get_index(lst, 'l')) # 4
print(get_index(lst, 'g')) # None
  

И возвращает None , если элемент не был найден.

Как было предложено в комментариях, лучшим решением было бы создать словарь сопоставлений индексов:

 def get_index(lst, item):
    indices = {x: i for i, (_, x) in enumerate(lst)}
    return indices.get(item)
  

Ответ №2:

Может помочь объявление класса, экземпляры которого «равны» любому значению.

 class Any:
    def __eq__(self, other):
        return True

list = [[1276, 'c'], [910, 'b'], [819, 'o'], [759, 'z'], [699, 'l']]
index = list.index([Any(), 'c'])
print(index)
  

Ответ №3:

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

 index = [c for _,c in list].index('c')
  

Ответ №4:

Вместо прямого перебора элементов в списке, он же for i in list , вы можете выполнить перебор целочисленного значения по длине списка, ОН же для i in range(len(list)) .

Вот пример того, как получить индекс правильного подсписка.

 list = [[1276, 'c'], [910, 'b'], [819, 'o'], [759, 'z'], [699, 'l']]
for i in range(len(list)):
    if 'c' in list[i]:
        index = i
        break
  

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

1. Разве вам не понадобились бы два числа, чтобы определить местоположение элемента в списке списков?

2. Мой пример показывает только, как получить индекс правильного подсписка, да. Чтобы получить правильный индекс в подсписке, решение уже предусмотрено в самом вопросе: index2 = list[i].index('c')

3. @wwii: Индекс символа всегда находится в подсписке [-1] или [1] внутри него. Итак, здесь основная задача — просто найти индекс подсписка, который содержит символ, всегда находящийся в позиции -1 или 1

Ответ №5:

Поиск с использованием словарей часто выполняется быстрее, поэтому вы можете создать словарь, например, вот так:

 list_dct  = dict([ [y, [i,x,y]] for i, (x, y) in enumerate(mylist)])
#=> {'c': [0, 1276, 'c'], 'b': [1, 910, 'b'], 'o': [2, 819, 'o'], 'z': [3, 759, 'z'], 'l': [4, 699, 'l']}
  

Таким образом, вы можете получить доступ к индексу как:

 list_dct['o'][0] #=> 2
  


Если вы можете избавиться от индекса, вы можете просто преобразовать свой список в dict, затем получить доступ по букве, чтобы получить целое число:

 list_dct = dict([ [y,x] for i, (x, y) in enumerate(mylist)])

list_dct #=> {'c': 1276, 'b': 910, 'o': 819, 'z': 759, 'l': 699}

list_dct['c'] #=> 1276
  


Помните, что дублированные ключи в словарях не допускаются.