2012-12-12 3 views
8

첫 번째 요소, 세 번째부터 200 번째까지의 요소와 201 번째 요소를 마지막 요소를 통해 3 단계 크기의 파이썬 목록에서 원한다고 가정 해 보겠습니다. old_list에 하나의 색인이 할 수있는 방법이 있나요파이썬 : 틈이있는 슬라이스에 대한 구문이 더 짧습니까?

new_list = old_list[0:1] + old_list[3:201] + old_list[201::3] 

:

한 가지 방법은 별개의 색인 생성 및 연결 함께 할까?

new_list = old_list[[0, 3:201, 201::3]] 

나는 몇 가지를 얻을 수 있습니다 : (난 그냥 가까운 뭔가를 찾고 있어요 목록 지수는 목록이 될 수 없으며, 파이썬 때문에 불행하게도 doesn't have slice literals 이후이하지 않는 알고 구문 일) 나는 다음과 같은 일을하고 싶습니다 이것은 NumPy 배열로 전환하는 것으로,하지만 네이티브 Python 목록을 만드는 방법에 더 관심이 있습니다. 나는 또한 a slice maker 또는 그와 비슷한 것을 만들 수 있고, 아마도 내게 원하는 모든 조각의 구성을 나타내는 등가의 슬라이스 객체를주는 강력한 팔을 만들 수 있습니다.

그러나 조각을 관리하기 위해 새 클래스를 만드는 것을 포함하지 않는 무언가를 찾고 있습니다. 슬라이스 구문을 연결하고이를 내 목록에 연결하고 목록에서 개별적으로 조각을 가져 와서 각각의 결과를 마지막에 연결한다는 것을 이해하도록하십시오.

+1

"불행히도 파이썬에는 슬라이스 프리미티브가 없습니다."슬라이스도 아닌가? –

+0

죄송합니다. 슬라이스 리터럴을 말해야하는데 슬라이스 프리미티브가 아닙니다. 즉, '(0 : 10 : 2)'구문을 마치 인덱스를 항상 나타내는 일부 개체처럼 전달할 수는 없습니다. 당신은 슬라이스 구문의 모든 멋진 점들을 파괴하는 당신 자신의 슬라이스 객체를 만드는 지루한 추가 레이어를 거쳐야합니다. 내 [위의 링크 된 질문] (http://stackoverflow.com/questions/13706258/passing-python-slice-syntax-around-to-functions)를 참조하십시오. – ely

답변

5

슬라이스 메이커 개체 (예 : SliceMaker을 사용자 정의 조각을 만들 t에 당신의 다른 질문 또는 np.s_)는 여러 개의 쉼표로 구분 된 조각을 허용 할 수 있습니다. 그들은 tupleslice의 또는 다른 개체로 수신 :

from numpy import s_ 
s_[0, 3:5, 6::3] 
Out[1]: (0, slice(3, 5, None), slice(6, None, 3)) 

NumPy와는 다차원 배열이를 사용하지만 슬라이스 연결에 사용할 수 있습니다 :이 "더 나은 경우

def xslice(arr, slices): 
    if isinstance(slices, tuple): 
     return sum((arr[s] if isinstance(s, slice) else [arr[s]] for s in slices), []) 
    elif isinstance(slices, slice): 
     return arr[slices] 
    else: 
     return [arr[slices]] 
xslice(list(range(10)), s_[0, 3:5, 6::3]) 
Out[1]: [0, 3, 4, 6, 9] 
xslice(list(range(10)), s_[1]) 
Out[2]: [1] 
xslice(list(range(10)), s_[:]) 
Out[3]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
+0

''xslice (list (range (10)), [1,2,3])''에서는 작동하지 않으며 최신 개정판에서는 작동하지 않습니다. 내 첫 번째 수정 않습니다. – Dzhuang

+0

@ Dzhuang 감사합니다! 후자의 2 가지 사례를 교환하면서 'insinstance (..., slice)'를 테스트하도록 수정했습니다. – ecatmur

0

아마도 자신의 시퀀스 유형을 작성하는 것이 좋습니다.

>>> L = range(20) 
>>> L 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 
>>> operator.itemgetter(*(range(1, 5) + range(10, 18, 3)))(L) 
(1, 2, 3, 4, 10, 13, 16) 

그리고 얻을 당신은 그 시작 :

>>> operator.itemgetter(*(range(*slice(1, 5).indices(len(L))) + range(*slice(10, 18, 3).indices(len(L)))))(L) 
(1, 2, 3, 4, 10, 13, 16) 
+0

나는 이것을 만들기 위해'itertools.islice'와'itertools.chain'을 사용할 것입니다. – PaulMcG

0

왜 돈, 당신은 당신의 목적을 위해

>>> from itertools import chain, islice 
>>> it = range(50) 
>>> def cslice(iterable, *selectors): 
    return chain(*(islice(iterable,*s) for s in selectors)) 

>>> list(cslice(it,(1,5),(10,15),(25,None,3))) 
[1, 2, 3, 4, 10, 11, 12, 13, 14, 25, 28, 31, 34, 37, 40, 43, 46, 49] 
+1

위에서 물어 본 질문에서 이전 질문에 대한 링크를 보았습니까?그 질문에 대한 답은 답과 같은 것을 구체화하지만 구문이 더 뛰어나며 'itertools'가 필요하지 않습니다. 내 목표는 그대로 슬라이스 구문을 그대로 전달하는 것입니다. 슬라이스를 튜플로 표현하고 새로운 객체에 전달하는 구문상의 오버 헤드를 추가하는 것은 별도의 슬라이스를 연결하는 것보다 훨씬 더 나쁩니다. – ely

+0

@EMS : 아니요, 그 대답은 슬라이스를 쉽게 만드는 방법을 설명하지만 목록의 요소를 색인 할 때 그대로 사용할 수는 없습니다. Abhijit 솔루션은 여러분이 원하는 것을 수행하며, 다른 답변과 결합하여 다음과 같은 멋진 구문을 가질 수 있습니다 :'cslice (it, make_slice [1 : 5], make_slice [10:15], make_slice [25 :: 3])' – Bakuriu

+0

@Bakuriu : 그게 전부였습니다. 'cslice'는리스트를 연결하는 것보다 열등한 조각을 묶는 것 외에는 아무것도하지 않습니다. 대답에서,'tuple'은'cslice'의 인자로 사용됩니다. 'SliceMaker' 예제의 결과가 전달 될 수 있음을 보여 주셔서 감사합니다.이 답변의 구문 확장이 완화되지만 충분하지는 않습니다. – ely

0

확실하지 않음 "하지만 그것은 특히 차에 비해 (아마도 느린

[y for x in [old_list[slice(*a)] for a in ((0,1),(3,201),(201,None,3))] for y in x]

... 그래서 왜 작동) 기본 파이썬 (3.5.2 테스트 용)

관련 문제