Набор индексов, соответствующих набору элементов в списке python3 - PullRequest
0 голосов
/ 27 июня 2019

Я сослался на этот пост, чтобы найти индекс (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)

Ответы [ 4 ]

1 голос
/ 27 июня 2019

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

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

[i for i, v in enumerate(mybiglist) if v in mytargetlist]
0 голосов
/ 27 июня 2019

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

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 голосов
/ 27 июня 2019

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

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

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

0 голосов
/ 27 июня 2019

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

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

...