#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
Помните, что дублированные ключи в словарях не допускаются.