리스트 활용


 지난번에 공부한 리스트에대해 좀 더 자세히 알아보겠습니다. for in 문을 이용해서 리스트를 생성하는 코드는 다음과 같습니다.

----------------------------------------------------------------------------------------

L=[]

for k in range(10):

L.append(k)

print L

----------------------------------------------------------------------------------------


- 리스트 내포


 리스트 내포를 이용하면 위 3줄의 코드를 한줄로 만들 수 있습니다. 리스트 내포의 리터럴(문법)은 다음과 같습니다.

----------------------------------------------------------------------------------------

[expression(식) for expr1 in sequence1:

   for expr2 in sequence2:


   for exprN in sequenceN:

         if condition] # 조건

# expression에는 반드시 한개의 원소가 들어가야 됩니다. x,y를 쓰고싶은경우 튜플의 형태 (x,y)로 사용해야 합니다.

----------------------------------------------------------------------------------------

 위에서 만든 리스트를 리스트 내포를 이용해서 만드는 코드는 다음과 같습니다.

----------------------------------------------------------------------------------------

L2=[k for k in range(10)]

print L2

----------------------------------------------------------------------------------------


 그렇다면, 조건은 어떻게 활용 할까요? 아래 코드는 k%2를 조건으로 줘서 2의 배수이면 거짓이되서 2의배수가 아닌 수의 제곱만 출력하는 코드입니다.

---------------------------------------------------------------------------------------- 

L3=[k*k for k in range(10) if k%2]

print L3

----------------------------------------------------------------------------------------
(실행 결과)
[1, 9, 25, 49, 81]
----------------------------------------------------------------------------------------

- 정렬

 
 sort() 메소드는 리턴값 없이 리스트를 정렬해서 변경하는 메소드였습니다. sort()메소드와 함께 활용하면 좋은 메소드에대해 알아보겠습니다.

- cmp(a,b) : 동일한 형의 인자 a,b를 비교해서 값을 리턴
a<b인 경우 -1, a>b인 경우 1, a=b인 경우 0 리턴
- sorted() 내장 함수 : 정렬해서 새로운 리스트를 반환, 원래 리스트는 변경하지 않음
- reverse() : 앞뒤를 바꿔서 원래 리스트를 변경
두번 호출하면 값이 변경되었더라도 원래 리스트로 변경
- reversed() 내장 함수 : reverse()메소드와 같은 기능이지만 새로운 리스트를 반환
 
 cmp()메소드를 활용해서 역순으로 정렬하는 코드입니다.
----------------------------------------------------------------------------------------
def mycmp(a1,a2):
    return cmp(a2,a1)    
L=[2,5,1,3,8,7]
L.sort(mycmp)
print L
----------------------------------------------------------------------------------------
(실행 결과)
[8, 7, 5, 3, 2, 1]
----------------------------------------------------------------------------------------

 sort()메소드의 인자에는 key와 reverse가 있습니다. key를 이용하면 원하는 자료형으로 정렬이 가능하고, reverse를 이용하면 역순으로 정렬할 수 있습니다.
----------------------------------------------------------------------------------------
L=['123','45','6','780']
L.sort() # 기본 정렬 - 맨 앞문자의 사전순으로 정렬
print L
L.sort(key=int) # int형으로 정렬
print L
L.sort(reverse=True) # 역순으로 정렬
print L
----------------------------------------------------------------------------------------
(실행 결과)
['123', '45', '6', '780'] 
['6', '45', '123', '780']
['780', '6', '45', '123']
----------------------------------------------------------------------------------------

 마지막으로, sorted() 내장 함수를 사용해 보겠습니다.
----------------------------------------------------------------------------------------
L=[1,5,8,3,4,7]
newL=sorted(L) # 새로운 리스트를 newL에 저장
print 'newL : ',newL
print 'L    : ',L
----------------------------------------------------------------------------------------
(실행 결과)
newL :  [1, 3, 4, 5, 7, 8]
L      :  [1, 5, 8, 3, 4, 7] # L의 리스트는 변화없음
----------------------------------------------------------------------------------------

출처 한국기술교육대학교 온라인평생교육원 파이썬프로그래밍



리스트와 리스트 메소드



- 리스트

 앞에서 공부하면서 사용했던 리스트에 대해 알아보겠습니다. 리스트는 문자형처럼 시퀀스 자료형이지만 문자열과는 다르게 변경이 가능한 자료형입니다. 인덱싱, 슬라이싱, 연결, 반복, 멤버십 테스트 연산이 가능합니다.

 다음은 리스트의 추가, 삭제 예시입니다.

----------------------------------------------------------------------------------------

l1=range(10) # 0부터 9까지의 리스트 생성
print l1

del l1[2] # 2번째 인덱스 삭제
print l1

Sun,Mon,Tue,Wed,Thu,Fri,Sat=range(7) # 여러 변수에 한번에 리스트 생성 가능
print Sun,Mon,Tue,Wed,Thu,Fri,Sat
----------------------------------------------------------------------------------------
(실행 결과)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 3, 4, 5, 6, 7, 8, 9]
0 1 2 3 4 5 6
----------------------------------------------------------------------------------------

- 중첩 리스트
 중첩 리스트는 리스트를 인자로 가지는 리스트를 말합니다. 다음과 같이 사용합니다.
----------------------------------------------------------------------------------------
s=[2,3,4]
t=[1,s,5] # 리스트 s를 인자로 사용
print t
print t[1][1] # t리스트의 1번째 인덱스의 1번째 인덱스
----------------------------------------------------------------------------------------
(실행 결과)
[1, [2, 3, 4], 5]
3
----------------------------------------------------------------------------------------

- 리스트가 지원하는 메소드

 리스트가 지원하는 메소드는 아래와 같습니다. java와 메소드 이름이 비슷한 것 같습니다. 

1. append() : 리스트 마지막에 원소를 추가
문자열, 튜플, 사전도 추가가능
2. insert(위치,값) : 해당하는 인덱스의 위치에 원하는 값 추가
3. index(위치) : 해당하는 원소의 인덱스가 몇인지 반환
4. count(값) : 해당하는 값이 몇개가 존재하는지 반환
5. reverse() : 리스트의 순서를 뒤바꿔 줌(값 변경)
6. sort() : 리스트의 값을 정렬해서 값을 변경
7. remove(값) : 해당하는 값을 삭제하는데, 값이 여러개일 경우 첫 번째 값 삭제
8. extend(값) : 기존의 리스트에 값 자체를 추가(병합)

----------------------------------------------------------------------------------------
# append()
ap=[1,2,3,4]
ap.append(10) # 가장 뒤에 10 추가
print ap
print '*'*50

# insert()
ins=[1,2,4,5]
ins.insert(2,3) # 2번째 자리에 3 추가
print ins
print '*'*50

# index()
ind=[1,2,3,4,5,6]
print ind.index(3) # 3에 해당하는 인덱스 값 
print '*'*50

# count()
co=[1,2,3,2,2,2,7]
print co.count(2) # 2가 몇개인지
print '*'*50

# reverse()
re=[1,2,3,4]
re.reverse() # 순서를 거꾸로
print re
print '*'*50

# sort()
so=[11,-3,4,-50]
so.sort() # 정렬
print so
print '*'*50

# remove()
rem=[11,-3,4,-50,-3]
rem.remove(-3) # -3을 제거
print rem
print '*'*50

# extend()
s=[1,2,3,4]
t=[5,6,7]
s.extend(t) # s리스트에 t리스트를 추가(병합)
print s
# extend()와 append() 비교
s2=s.append(t) # append는 리스트 자체를 추가
print s2

----------------------------------------------------------------------------------------
(실행 결과)
[1, 2, 3, 4, 10]
**************************************************
[1, 2, 3, 4, 5]
**************************************************
2
**************************************************
4
**************************************************
[4, 3, 2, 1]
**************************************************
[-50, -3, 4, 11]
**************************************************
[11, 4, -50, -3]
**************************************************
[1, 2, 3, 4, 5, 6, 7]
----------------------------------------------------------------------------------------

- 리스트를 스택, 큐로 이용

 스택은 후입선출 구조, 큐는 선입선출 구조를 가집니다. 리스트의 메소드를 이용해서 스택과 큐처럼 사용할 수 있습니다. append()메소드와 pop()메소드를 이용합니다. pop()메소드는 기본적으로 마지막 원소를 꺼내고, 인자안에 인덱스를 적어주면 해당하는 인덱스의 값을 꺼냅니다.
----------------------------------------------------------------------------------------
# stack
s=[10,20,30,40,50]
s.append(60)
print s
print s.pop()
print s
print s.pop()
print s
print '*'*50

# queue
q=[10,20,30,40,50]
q.append(60)
print q
print q.pop(0)
print q
print q.pop(0)
print q
----------------------------------------------------------------------------------------
(실행 결과)
[10, 20, 30, 40, 50, 60]
60 # 가장 마지막 원소인 60을 꺼냄
[10, 20, 30, 40, 50]
50 # 가장 마지막 원소인 50을 꺼냄
[10, 20, 30, 40]
**************************************************
[10, 20, 30, 40, 50, 60]
10 # 가장 앞의 원소인 10을 꺼냄
[20, 30, 40, 50, 60]
20 #가장 앞의 원소인 20을 꺼냄
[30, 40, 50, 60]
----------------------------------------------------------------------------------------

출처 한국기술교육대학교 온라인평생교육원 파이썬프로그래밍



+ Recent posts