Явно выберите элементы из списка или кортежа Python

У меня есть следующий список Python (также может быть кортеж):

myList = ['foo', 'bar', 'baz', 'quux'] 

я могу сказать

 >>> myList[0:3] ['foo', 'bar', 'baz'] >>> myList[::2] ['foo', 'baz'] >>> myList[1::2] ['bar', 'quux'] 

Как явным образом выделяю элементы, индексы которых не имеют конкретных шаблонов? Например, я хочу выбрать [0,2,3] . Или из очень большого списка из 1000 пунктов, я хочу выбрать [87, 342, 217, 998, 500] . Есть ли какой-нибудь синтаксис Python? Что-то похожее:

 >>> myBigList[87, 342, 217, 998, 500] 

6 Solutions collect form web for “Явно выберите элементы из списка или кортежа Python”

 list( myBigList[i] for i in [87, 342, 217, 998, 500] ) 

Я сравнил ответы с python 2.5.2:

  • 19.7 usec: [ myBigList[i] for i in [87, 342, 217, 998, 500] ]

  • 20.6 usec: map(myBigList.__getitem__, (87, 342, 217, 998, 500))

  • 22.7 itemgetter(87, 342, 217, 998, 500)(myBigList) : itemgetter(87, 342, 217, 998, 500)(myBigList)

  • 24.6 usec: list( myBigList[i] for i in [87, 342, 217, 998, 500] )

Обратите внимание, что в Python 3 1-й был изменен так же, как на 4-м.


Другой вариант – начать с numpy.array который позволяет индексировать через список или numpy.array :

 >>> import numpy >>> myBigList = numpy.array(range(1000)) >>> myBigList[(87, 342, 217, 998, 500)] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: invalid index >>> myBigList[[87, 342, 217, 998, 500]] array([ 87, 342, 217, 998, 500]) >>> myBigList[numpy.array([87, 342, 217, 998, 500])] array([ 87, 342, 217, 998, 500]) 

tuple не работает так же, как и фрагменты.

Как насчет этого:

 from operator import itemgetter itemgetter(0,2,3)(myList) ('foo', 'baz', 'quux') 

Он не встроен, но вы можете сделать подкласс списка, который принимает кортежи как «индексы», если вы хотите:

 class MyList(list): def __getitem__(self, index): if isinstance(index, tuple): return [self[i] for i in index] return super(MyList, self).__getitem__(index) seq = MyList("foo bar baaz quux mumble".split()) print seq[0] print seq[2,4] print seq[1::2] 

печать

 foo ['baaz', 'mumble'] ['bar', 'quux'] 
 >>> map(myList.__getitem__, (2,2,1,3)) ('baz', 'baz', 'bar', 'quux') 

Вы также можете создать свой собственный класс List который поддерживает кортежи в качестве аргументов __getitem__ если вы хотите иметь возможность делать myList[(2,2,1,3)] .

Возможно, понимание списка в порядке:

 L = ['a', 'b', 'c', 'd', 'e', 'f'] print [ L[index] for index in [1,3,5] ] 

Производит:

 ['b', 'd', 'f'] 

Это то, что вы ищете?

Я просто хочу указать, даже синтаксис itemgetter выглядит очень аккуратно, но он медленный, когда вы выполняете в большом списке.

 import timeit from operator import itemgetter start=timeit.default_timer() for i in range(1000000): itemgetter(0,2,3)(myList) print ("Itemgetter took ", (timeit.default_timer()-start)) 

Уведомили 1.065209062149279

 start=timeit.default_timer() for i in range(1000000): myList[0],myList[2],myList[3] print ("Multiple slice took ", (timeit.default_timer()-start)) 

Несколько фрагментов приняли 0,6225321444745759

  • преобразование строки в кортеж
  • дополнительный пустой элемент при удалении элемента из кортежа
  • Сохранение словаря, ключи которого являются кортежами с json, python
  • в Python, Как присоединиться к списку кортежей в один список?
  • Добавление двух кортежей в элемент
  • Сгенерировать список наборов диапазонов с заданными границами в python
  • Новичок Python Вопрос о кортежах
  • Операции с элементами типа Python, такие как сумма
  • Python - лучший язык программирования в мире.