Как я могу индексировать одно значение из списка, содержащего подсписки в Python? - PullRequest
1 голос
/ 23 марта 2019

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

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

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

index = list.index('c')

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

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

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

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

Спасибо

Ответы [ 5 ]

1 голос
/ 23 марта 2019

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

index = [c for _,c in list].index('c')
1 голос
/ 23 марта 2019

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

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)
1 голос
/ 23 марта 2019

Если вы знаете, что внутренние списки будут иметь только два значения, вы можете создать свою собственную функцию, чтобы получить первый элемент, который соответствует 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)
1 голос
/ 23 марта 2019

Вместо прямой итерации по элементам в списке AKA for i in list, вы можете выполнить итерацию целочисленного значения по длине списка AKA для 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
0 голосов
/ 23 марта 2019

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

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


Помните, что дублированные ключи в словаряхне допускается.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...