Я ссылался на этот пост для поиска индекса (ices), соответствующего одному именованному элементу в списке, но не смог найти ответ на мой запрос среди ответов там / документации.

В частности: есть ли более эффективный способ, чем просто итерация метода по ссылке выше, для нахождения индексов, соответствующих набору элементов?

Скажи у меня есть список

mybiglist=['abc','def','ghi','jkl','mno']

И я хочу, чтобы индексы соответствовали 'abc','jkl'

Я мог бы сделать:

mytargetlist=['abc','jkl']
for string in mytargetlist:
    print(mybiglist.index('%s' %string))

Но кажется, что должен быть более эффективный способ, чем цикл?

В случае, если контекст имеет значение, я пытаюсь найти индексы, соответствующие определенным вершинам графа, чтобы я мог использовать induce_subgraph для создания подграфа, содержащего эти вершины. К сожалению, я знаю только те метки имен, которые мне нужны и которые приписаны к вершинам, а аргументы induce_subraph следующие: induce_subgraph (graph, vertex set)

0
Meep 27 Июн 2019 в 16:34

4 ответа

Лучший ответ

Вы можете сделать это один раз через свой большой список с пониманием.

mybiglist=['abc','def','ghi','jkl','mno']
mytargetlist=['abc','jkl']

[i for i, v in enumerate(mybiglist) if v in mytargetlist]
1
Kyle Parsons 27 Июн 2019 в 13:45

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

mybiglist = ['abc', 'def', 'ghi', 'jkl', 'mno']
mytargetlist = ['abc', 'jkl']
print([mybiglist.index(target) for target in mytargetlist])

Если вам нужно решение с избыточным количеством ресурсов, вы можете использовать numpy с isin и where, чтобы получить индексы, не повторяя его самостоятельно:

import numpy as np

mybiglist = np.array(['abc', 'def', 'ghi', 'jkl', 'mno'], dtype=str)
mytargetlist = ['abc', 'jkl']

print(*np.where(np.isin(mybiglist, mytargetlist)))

Но это кажется немного смешным: P

0
Adam.Er8 27 Июн 2019 в 13:45

Это разделит ваш целевой список на куски и запустит отдельные потоки. Подробнее здесь:

import concurrent.futures

mybiglist=['abc','def','ghi','jkl','mno']
mytargetlist=['abc','jkl']

def get_index(x):
    return mybiglist.index(x)

with concurrent.futures.ProcessPoolExecutor() as executor:
    results = executor.map(get_index, mytargetlist)

print(list(results))
0
javierjsa 27 Июн 2019 в 13:53

mybiglist.index(string) имеет сложность O(n), поэтому в основном вы делаете двойной цикл for mybiglist и mytargetlist. Вы можете улучшить на enumerate:

indices = {v:i for i,v in enumerate(mybiglist)}

И вы можете получить доступ к индексам позже, т.е. indices['abc'].

0
Quang Hoang 27 Июн 2019 в 13:45