Создать фрагмент с помощью кортежа - PullRequest
20 голосов
/ 16 августа 2011

Есть ли в Python способ использовать кортеж в качестве индексов для среза? Неверно следующее:

>>> a = range(20)
>>> b = (5, 12)   # my slice indices
>>> a[b]          # not valid
>>> a[slice(b)]   # not valid
>>> a[b[0]:b[1]] # is an awkward syntax
[5, 6, 7, 8, 9, 10, 11]
>>> b1, b2 = b
>>> a[b1:b2]      # looks a bit cleaner
[5, 6, 7, 8, 9, 10, 11]

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

(обновление) И решение оказывается:

>>> a[slice(*b)]
[5, 6, 7, 8, 9, 10, 11]

Ответы [ 4 ]

36 голосов
/ 16 августа 2011

Вы можете использовать синтаксис Python *args для этого:

>>> a = range(20)
>>> b = (5, 12)
>>> a[slice(*b)]
[5, 6, 7, 8, 9, 10, 11]

По сути, вы говорите Python распаковать кортеж b в отдельные элементы и передать каждый из этих элементов в функцию slice() в качестве отдельных аргументов.

10 голосов
/ 16 августа 2011

Как насчет a[slice(*b)]?

Это достаточно питонно?

4 голосов
/ 16 августа 2011

slice принимает до трех аргументов, но вы даете ему только один с кортежем.Что вам нужно сделать, это заставить Python распаковать его, например, так:

a[slice(*b)]
2 голосов
/ 16 августа 2011

Отсутствует только один крошечный символ;)

In [2]: a = range(20)

In [3]: b = (5, 12)

In [4]: a[slice(*b)]
Out[4]: [5, 6, 7, 8, 9, 10, 11
...