Мне нужно выбрать несколько элементов из данного списка, зная их индекс. Допустим, я хотел бы создать новый список, который содержит элемент с индексом 1, 2, 5 из данного списка [-2, 1, 5, 3, 8, 5, 6]. Что я сделал, это:
a = [-2,1,5,3,8,5,6]
b = [1,2,5]
c = [ a[i] for i in b]
Есть ли лучший способ сделать это? что-то вроде c = a [b]?
lambda
функцию.Ответы:
Вы можете использовать
operator.itemgetter
:Или вы можете использовать NumPy :
Но на самом деле ваше текущее решение в порядке. Это, наверное, самое лучшее из всех.
источник
c = [a[i] for i in b]
это прекрасно. Обратите внимание, чтоitemgetter
решение не будет делать то же самое, если b имеет менее 2 элементов.a[b]
работает только тогда, когдаa
это массив NumPy , т.е. вы создаете его с помощью функции NUMPY.Альтернативы:
источник
build-in
__getitem__
она не может быть сопоставимой, например, как сопоставить тип элемента?map(type(a.__getitem__), b)
lambda x: type(a.__getitem__(x)), b
. В этом случае использование[..]
более компактно:lambda x: type(a[x]), b
Другое решение может быть с помощью серии панд:
Затем вы можете преобразовать c обратно в список, если хотите:
источник
Базовое и не очень обширное тестирование, сравнивающее время выполнения пяти предоставленных ответов:
используя следующий вход:
простой цикл python был самым быстрым с лямбда-операцией за секунду, mapIndexValues и getIndexValues были последовательно очень похожи с методом numpy, значительно медленнее после преобразования списков в массивы numpy. Если данные уже находятся в массивах numpy, метод numpyIndexValues с удаленным преобразованием numpy.array быстрый.
источник
numpyIndexValues
не работает, посколькуa
,b
имеют типrange
. Я предполагаю , что вы Мент обращенныйa
,b
вnumpy.ndarrays
первую очередь?Я уверен, что это уже учитывалось: если количество индексов в b мало и постоянно, можно просто написать результат как:
Или даже проще, если сами индексы являются константами ...
Или, если есть последовательный диапазон показателей ...
источник
[a] + [b] = [a, b]
Вот более простой способ:
источник
В моем ответе не используются коллекции numpy или python.
Один из тривиальных способов поиска элементов был бы следующим:
Недостаток: этот метод может не работать для больших списков. Использование больших номеров рекомендуется для больших списков.
источник
a
.[a[i] for i in b]
a
было еще 5?[a[i] if i<len(a) else None for i in b]
Статические индексы и небольшой список?
Не забывайте, что если список небольшой и индексы не меняются, как в вашем примере, иногда лучше всего использовать распаковку последовательности :
Производительность намного лучше, и вы также можете сохранить одну строку кода:
источник
Вид питонического пути:
источник
O(n)
решение вO(n^2)
решение, почти удвоив длину кода. Вы также захотите отметить, что подход потерпит неудачу, если список содержит объекты, будет нечеткое или частичное равенство, например, еслиa
содержитfloat('nan')
, это всегда вызовет aValueError
.