2011-08-15 33 views
19

Bir dilim için bir tuple kullanmak için python'da herhangi bir yol var mı? aşağıdaki geçerli değil:Bir dilim kullanarak dilim oluşturma

>>> 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] 

O yüzden ben bunu yapamam şaşırıyorum oldukça pythonic sözdizimi gibi görünüyor.

(güncelleme) Ve çözüm olarak çıkıyor:

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

cevap

33

Bunun için Python'un *args sözdizimini kullanabilirsiniz:

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

Temel olarak, içine tuple b açmak için Python söylüyorsun ne yapmanız gereken piton şöyle, bunu açmak zorunda olduğunu bireysel elemanlar ve bu elemanların her birinifonksiyonuna bireysel argümanlar olarak iletir. Sadece bir küçük karakter eksik

10

ne dersiniz a[slice(*b)]?

Bu yeterince pesfonik midir?

+0

. Eğer bir [* b] 'yazabilirsem daha pythonic olurdu. Tabii ki bu, çok boyutlu dizilerle çatışacak, böylece sıradan dilimleme sözdizimi hala daha iyi. Dilimleme kelimesinin eklenmesi uzun sürmektedir, ancak muhtemelen kodun amacını çok daha açık bir şekilde göstermektedir. – Mike

4

slice üç argüman alır, ancak bunu yalnızca bir tuple ile veriyorsunuz.

a[slice(*b)] 
2

;) ben tamamen Python en `* args` sözdizimi hakkında unutmuştu

In [2]: a = range(20) 

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

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