2016-08-04 1 views
0

파이썬에서 2D 목록이 있고 Data인데 첫 번째 인덱스의 모든 요소와 두 번째의 단일 요소를 모두 선택하는 2D 목록 조각을 만들고 싶습니다.비단뱀 조각 인덱싱이 왜 직관적 인 결과를 낳습니까?

예 :

Data = [[a,b,c],[d,e,f],[h,i,g]] 

나는 목록을 원한다.

raw_data = [b,e,i] 

왜 이렇게합니까?

raw_data = Data[:][1] 

원하는 출력을 제공하지 않습니까? 나는 첫 번째 인덱스 전체와 두 번째 인덱스를 지정했습니다. 대신에 나는 출력을 얻습니다;

raw_data = [d,e,f] 

내가 기대하는 바는 무엇입니까?

raw_data = Data[1][:] 

raw_data = [d,e,f] 

그래서;

Data[1][:] = Data[:][1] 

목록이 어떻게 파이썬에서 작동하는지 내 정신 모형과 호환되지 않습니다.

대신 루프를 사용해야합니다.

raw_data = [] 

for i in xrange(0,len(Data),1): 
     raw_data.append(Data[i][1]) 

그래서 제 질문은 사람이 왜 Data[1][:] = Data[:][1]을 설명 할 수있다?

읽어 주셔서 감사합니다.

+0

가 복용 data의 사본의 인덱스 1 요소를 의미 목록의 전체 슬라이스가 사본을 작성하므로 목록의 동일한 사본을 만들고 항목에서 '1'을 얻거나 항목 '1'을 가져 와서 결과의 사본을 만듭니다. –

+0

나는 당신이 이것을 할 수있는 다차원리스트를 가지고있는 프로그래밍 언어에서 왔다고 가정한다. 만약'numpy'를 시도한다면 원하는 결과를 얻기 위해'Data [:, 1]'을 할 수있다. –

+0

'list [:]'는'list '가 무엇이든간에 단지 사본입니다. 의미는'data [:] == data' (ish)와'data [1] == data [1] [:]'입니다. 그래서 물론'data [1] [:] == data [:] [1]' –

답변

2

lst[:]에는 명시 적 시작이 없으므로 Python 설명서에 따라 목록의 시작 부분에서 끝나는 목록의 사본을 반환합니다. 즉, 이전에 가지고 있던 동일한 목록의 복사본을 반환합니다. 그래서 : 당신이 Data[:]을 말할 때

>>> Data = [['a','b','c'],['d','e','f'],['h','i','g']] 
>>> Data[:] 
[['a', 'b', 'c'], ['d', 'e', 'f'], ['h', 'i', 'g']] 

그래서, 그 Data[:][1]은 본질적으로 [d,e,f]

, 이는 단지 Data[1] 것을 의미, Data의 사본과 동일하게 평가합니다 당신이 그것을 다른 방법으로 할 경우 :

>>> Data[1] 
['d', 'e', 'f'] 
>>> Data[1][:] 
['d', 'e', 'f'] 

당신은 데이터, [d,e,f]의 두 번째 요소를 얻을, 당신은 같은 목록 슬라이스 구문은 이전과 다시 동일한 목록을 얻을 것을 사용합니다. 과

>>> [x[1] for x in Data] 
['b', 'e', 'i'] 

간단한 : 당신이 원하는 것을 얻을

, 나는 지능형리스트를 사용하십시오.

+0

당신은 문자 그대로 20 초에 나를 때렸습니다 : D –

+0

당신은'l [:]'이 list_의 복사본을 생성하고, 동일한리스트를 반환하지 않는다는 것을 언급하지 않았습니다! 이 경우에는 중요하지 않지만 슬라이스에 대한 오해가 쉽게 퍼질 수 있습니다. –

+0

네 말이 맞아, 내가 더 분명 했어야 했어. 아마 지금은 중요하지 않지만, 더 명확 해 지도록 편집 했어. – James

0

왼쪽에서 오른쪽으로 진행되는 과정을 거치면 꽤 분명합니다.[[a,b,c],[d,e,f],[h,i,g]]

raw_data = Data[:][1] 

다음 [d,e,f] 인이 목록에 인덱스 1에서 당신에게 요소를 줄 것이다 :

raw_data = Data[:] 

당신에게 데이터의 전체, 그래서 목록의 전체 목록을 제공합니다. 한편

, raw_data = 데이터 [1] 또한 [d,e,f]있는 데이터의 위치 (1)의 요소를 리턴한다.

[:]이 개체는 다시 전체를 반환합니다.

raw_data = [x[1] for x in Data] 

이 당신에게 데이터의 모든 목록에있는 모든 두 번째 요소의 목록을 제공합니다 :

은 당신이 할하려는 것은 최고의 같은 지능형리스트로 이루어집니다.

1

바닐라 파이썬에는 2 차원 배열이 없지만이를 구현하는 확장이 허용됩니다. 목록의 목록은 다소 다릅니다.

에 대한 해결책은 2 차원 배열 유형을 가진 numpy을 사용하는 것입니다. 그런 다음 말할 수 data[:,1]

왜이 예상대로 귀하의 예제가 작동하지 않습니다 data[:] 수단 "data의 사본을"등 data[:][1][d,e,f]

+0

2 차원 짜증 나는 배열은 실제로 배열의 배열이다.별로 차이가 없다. 그의 사용 사례에서 numpy는 실제로 아무 것도 추가하지 않습니다. – James

+0

@James 목록과 numpy 배열은 극적으로 다르게 구현되므로 배열의 열에 액세스하는 것이 훨씬 쉽습니다. [Data [:, 1]] 다차원 목록. –

+0

@James 필자가 동의하지 않는 경향이있는 배열은 다차원 구조이다. 개념적으로 이는 목록의 목록과 다릅니다. 실제로 2 차원 배열을 가지고 있고 일관된 유형의 데이터를 포함하고 있다면'data [:, 1]'은 더 짧고 이해하기 쉽고 읽기 쉽고 빠릅니다. 목록의 목록 (예 : 가변 길이 행, 일관성없는 유형)이 실제로있는 경우 이해가 더 자연 스럽습니다. –

관련 문제