Post List

2015년 7월 28일 화요일

Python 기초 #07 List

1. List의 특징

앞서 배운 문자열은 char 형만 저장 가능하며 요소가 초기화 되면 바뀔 수 없는 List 라고 설명한 적이 있습니다.
List는 요소(element)들을 저장하는 Collection 중에 하나 입니다.
요소들은 모두 같은 타입일 필요가 없습니다. 임의의 타입들을 섞어서 넣을 수도 있고,
다른 Collection을 넣을 수도 있습니다.
아무 값도 넣지않은 Empty List 생성도 가능합니다. ( [ ] )
일단 List를 생성한 이후에 값을 나중에 추가 할 경우 사용하면 됩니다.

>>> DBList = ['Oracle','DB2','PetaSQL']
>>> MBD = [1977,07,26]
>>> EmptyList = []
>>>
print DBList,MBD,EmptyList
 ['Oracle', 'DB2', 'PetaSQL'] [1977, 7, 26] []
>>> SuperList = ['Luna', DBList, MBD, EmptyList, 3.14]
>>> print SuperList
['Luna', ['Oracle', 'DB2', 'PetaSQL'], [1977, 7, 26], [], 3.14]

List는 String 과는 다르게 내부 값 변경이 가능합니다.
내부 요소에 접근하기 위해서는 해당 요소가 몇 번째 들어있는지 그 Index를 이용하면 되는데,
0을 포함한 양수를 Index로 할 경우 앞에서 부터 찾아가고,
음수를 Index로 할 경우 뒤에서 부터 찾아갑니다.

>>> print DBList[0], DBList[-1]
Oracle PetaSQL
>>> DBList[0] = 'MS-SQL'
>>> print DBList[-3]
MS-SQL
>>> print DBList
['MS-SQL', 'DB2', 'PetaSQL']

2. List 운행법(traversal)

앞서 배운 string과 같습니다.
가장 쉬운 방법으로는 for ... in 을 이용하는 방법이 있습니다.

for DB in DBList:
    print DB

그런데, 만약 해당 요소값을 변경하려면, 그 index까지도 필요하겠지요.
그렇다면 위 방법으로는 안되고, range 와 len 함수를 이용하여 운행하는 방법을 사용해야 합니다.
참고로 range 함수는 0 에서 n - 1 까지의 값을 생성하여 i로 전달합니다.

for i in range(len(MBD)):
    MDB[i] += 100

여기서 알아두어야 할 점은,
- Empty List는 for문의 Body 부분이 실행되지 않습니다.
- Nested List의 경우 내부의 List도 하나의 요소로 취급됩니다.

3. List 연산

+ 연산자는 2개의 List를 합쳐서 하나의 List로 만듭니다.

>>> A = DBList + MBD
>>> print A
['MS-SQL', 'DB2', 'PetaSQL', 1977, 7, 26]

* 연산자는 List를 그 횟수만큼 반복하여 생성합니다.

>>> B = DBList * 3
>>> print B
['MS-SQL', 'DB2', 'PetaSQL', 'MS-SQL', 'DB2', 'PetaSQL', 'MS-SQL', 'DB2', 'PetaSQL']

- 와 / 연산자는 지원하지 않습니다.

List를 쪼개는 방법은 string 에서 substring 을 생성할때 잠깐 소개를 했는데
Index에 : 를 넣어서 그 범위를 표현해주면 됩니다.
: 앞에 숫자에서 뒤에 숫자 - 1까지를 subset으로 생성해줍니다.
: 앞에 숫자가 생략되면 처음부터 뒤에 숫자 - 1까지 생성해주며,
: 뒤에 숫자가 생략되면 앞에 숫자부터 마지막 요소까지 생성해 줍니다.

>>> B[2:6]
['PetaSQL', 'MS-SQL', 'DB2', 'PetaSQL']
>>> B[:3]
['MS-SQL', 'DB2', 'PetaSQL']

>>> B[2:]
['PetaSQL', 'MS-SQL', 'DB2', 'PetaSQL', 'MS-SQL', 'DB2', 'PetaSQL']

4. List Method

List에서 사용가능한 method 목록은 dir 명령어로 확인이 가능합니다.

>>> dir(DBList)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

.append (요소) 는 List의 마지막에 해당 요소를 추가합니다.
.extend (List) 는 인수로 받은 List의 모든 요소를 추가합니다.
.sort( ) 는 오름차순으로 List 요소들을 정렬합니다.
.sort(reverse=True) 로 실행하면 내림차순으로 정렬됩니다.
.pop(Index) 는 해당 Index의 요소를 return 해주면서 그 요소를 List에서 삭제합니다. 인자가 없으면 마지막 요소를 삭제하면서 return 합니다.
.remove(요소) 는 해당 요소를 찾아서 삭제합니다. 같은 요소가 2개 이상 있을 경우 앞에 것만 삭제합니다.

>>> DBList.append('MongoDB')
>>> print DBList
['MS-SQL', 'DB2', 'PetaSQL', 'MongoDB']
>>> DBList.extend(['Altibase','Tibero','DM7'])
>>> print DBList
['MS-SQL', 'DB2', 'PetaSQL', 'MongoDB', 'Altibase', 'Tibero', 'DM7']
>>> DBList.sort()
>>> print DBList
['Altibase', 'DB2', 'DM7', 'MS-SQL', 'MongoDB', 'PetaSQL', 'Tibero']
>>> DBList.sort(reverse=True)
>>> print DBList
['Tibero', 'PetaSQL', 'MongoDB', 'MS-SQL', 'DM7', 'DB2', 'Altibase']
>>> DB = DBList.pop(0)
>>> print DB
Tibero
>>> print DBList
['PetaSQL', 'MongoDB', 'MS-SQL', 'DM7', 'DB2', 'Altibase']
>>> DBList.extend([
'MS-SQL', 'PetaSQL'])
>>> print DBList
['PetaSQL', 'MongoDB', 'MS-SQL', 'DM7', 'DB2', 'Altibase', 'MS-SQL', 'PetaSQL']
>>> DBList.remove('MS-SQL')
>>> print DBList
['PetaSQL', 'MongoDB', 'DM7', 'DB2', 'Altibase', 'MS-SQL', 'PetaSQL']

5. List Functions

del List[Index] : .pop() 과는 다르게 return 값 없이 해당 요소를 삭제합니다.
del List[a:b] : 해당 List의 a 에서 b - 1 까지의 요소들을 삭제합니다.
len (List) : 해당 List의 길이를 return 합니다.
max(List) , min(List) , sum(List) : 대충 함수 명만 봐도 아시겠죠 ? 최대값, 최소값, 합계를 return 합니다.
list(string) : 해당 문자열을 list로 생성해줍니다. string는 변경이 안되므로 list로 바꾼뒤 변경하여 다시 string 로 생성을 하는 방법을 사용합니다.
List = string.split(delimeter) : string 을 구분자(delimeter) 로 구분하여 List로 생성합니다. 구분자를 주지 않으면 Space ' '로 구분합니다.
string = delimeter.join(List) : List안에 요소들 사이에 구분자를 붙여줘서 string 로 생성합니다. 공백없이 문자열들을 결합할려면 구분자로 빈문자열 ''를 사용하면 됩니다.

>>> print DBList
['PetaSQL', 'MongoDB', 'MS-SQL', 'DM7', 'DB2', 'Altibase', 'MS-SQL', 'PetaSQL']
>>> DBList.remove('MS-SQL')
>>> print DBList
['PetaSQL', 'MongoDB', 'DM7', 'DB2', 'Altibase', 'MS-SQL', 'PetaSQL']
>>> del DBList[0]
>>> print DBList
['MongoDB', 'DM7', 'DB2', 'Altibase', 'MS-SQL', 'PetaSQL']
>>> del DBList[1:4]
>>> print DBList
['MongoDB', 'MS-SQL', 'PetaSQL']
>>> len(DBList)
3
>>> max(DBList)
'PetaSQL'
>>> min(DBList)
'MS-SQL'
>>> Numbers = [1977,07,26]
>>> sum(Numbers)
2010
>>> S = 'Luna the Star Dev Story'
>>> LS = S.split()
>>> print LS
['Luna', 'the', 'Star', 'Dev', 'Story']
>>>
' '.join(LS)
'Luna the Star Dev Story'
>>> ''.join(LS)
'LunatheStarDevStory'
>>> SP = list(S)
>>> print SP
['L', 'u', 'n', 'a', ' ', 't', 'h', 'e', ' ', 'S', 't', 'a', 'r', ' ', 'D', 'e', 'v', ' ', 'S', 't', 'o', 'r', 'y']

6. Aliasing

string 같은 경우는 서로 다른 두 변수가 같은 문자열을 가진 경우 같은 개체를 참조(reference)하게 됩니다.

>>> A = 'Luna'
>>> B = 'Luna'
>>> A is B
True

이렇게 하나에 1개체에 두 개 이상의 변수가 할당된 경우를 Aliased 되었다고 합니다.

같은 요소들을 가진 List를 2개 만들어도 그겉 같은 대상을 참조하지 않습니다.
하지만 List를 그대로 다른 변수에 대입을 하게 되면 같은 대상을 참조하는 Aliasing 상태가 됩니다.
이럴 경우 그 중 하나의 요소를 변경시키면 나머지도 같이 변경됩니다.

>>> C = [ 1, 2, 3]
>>> D = [ 1, 2, 3]
>>> C is D
False
>>> E = C
>>> C is E
True
>>> E.append(5)
>>> C
[1, 2, 3, 5]

List를 함수의 인자로 넘길 경우 다른 변수에 대입하는 것처럼 처리되므로 Aliasing 상태가 됩니다.

연습문제07
E-mail을 발송한 사람이 누구누구이며, 총 몇명에게 받았는지 출력하세요.
연습문제06 에서 사용한 'mbox.txt'파일을 사용하여 다음의 작업을 하세요.
'mbox.txt'파일은 http://www.py4inf.com/code/mbox.txt 에서 다운로드가 가능합니다.
'From:' 이 아닌 'From' 으로 시작하는 라인의 두번째 단어를 출력하세요.
그리고 그 줄의 개수를 Count 하면 됩니다.