티스토리 뷰

Python

리스트에 대한 기초 지식

techbard 2015. 7. 7. 09:40
  • 특성
    1. 컨테이너이다. = 무언가를 그 안에 담을 수 있는 틀을 제공한다.
    2. 안에 담는 내용물은 순서를 가진다. = 정수를 증가시켜 순서대로 접근할 수 있다.
    3. 변경 가능하다. = 내용물을 삭제하거나 단순 추가하거나, 삭제 후 그 자리에 바로 추가(변경) 가능하다.
  • 예제
    • 컨테이너

listIsContainer = [] # 빈 리스트를 만든다.


print(type(listIsContainer)) # 리스트인가?


(결과)

<class 'list'>


# 방금 생성한 리스트에는 아무 것도 들어있지 않다.

print(len(listIsContainer))


(결과)

0


listIsContainer[0:1] = '1' # 리스트 첫번째 자리에 1 이라는 스트링을 넣는다.

print(listIsContainer)


(결과)

['1']


# 리스트에 무언가 들어 있다가 이제는 새로 생성할 때와 같아졌으니 리스트를 비운다.

listIsContainer = []

print(listIsContainer)


(결과)

[]


listNumberTwo = ["firstString"]

listIsContainer.append(listNumberTwo)

print(listIsContainer) # 리스트 안에 또 다른 리스트를 넣을 수도 있다.


(결과)

[['firstString']]

  • 순서가 있음

listIsContainer[:] = '1'

# 아직까지는 [:] 의미를 알 수 없어도 '1'이 리스트에 들어갔음을 알 수 있다.

print(listIsContainer)


결과)

['1']


listIsContainer[:] = '2'

# '1'이 들어 있었는데 그것이 삭제되고 '2'가 들어갔음을 알 수 있다.

print(listIsContainer)


결과)

['2']


# 리스트의 가장 첫번째 요소는 정수 0으로 접근 가능하다.

print(listIsContainer[0:1])


결과)

['2']


# 두번째 요소는 정수 1로 접근 가능하다.

listIsContainer[1:2] = '3'

print(listIsContainer)


결과)

['2', '3']

  • 변경 가능함

listIsContainer = []

# 리스트에 '1'을 추가

listIsContainer[:] = '1'

# 리스트에 있는 '1' 자리에 '2'를 넣어서 '1'은 삭제되고 '2'로 바뀜

listIsContainer[0:1] = '2'

print(listIsContainer)


(결과)

['2']

  • 리스트 요소의 빠른 생성

# 리스트는 객체이므로 변수에 할당할 수 있고 그 변수를 통해 객체에도 접근할 수 있다.

ln = list('0123456789')

print(ln)


결과)

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']


# range() 함수를 쓰면 리스트에 숫자를 담을 수 있다.

ln = list(range(0, 10))

print(ln)


결과)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

  • 알파벳 a ~ z 문자열을 가진 리스트를 빠르게 생성하려면?

# 알파벳 문자 출력

print('a')


결과)

a


# 이런 식으로 리스트의 요소를 모두 적는 것도 가능하다.

alphaList = list('abcdefghijklmnopqrstuvwxyz')

print(alphaList)


결과)

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']


# ranger() 함수에 알파벳 문자를 써서 쉽게 리스트를 만들 수는 없을까?

print(list(range('a', 'z')))


결과)

TypeError: 'str' object cannot be interpreted as an integer


# 이렇게 하면 정수를 조작해서 알파벳 소문자를 만들 수 있다.

print(chr(97))


결과)

a


# 이제 range() 함수를 사용해서 알파벳 요소를 가진 리스트를 생성할 수 있다.

결과)

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']


다시 


코드 실행 과정을 시각적으로 표현해 주는 웹 서비스로 동작 과정을 살펴보자.













  • 리스트 객체가 가진 메쏘드를 이용해서 요소를 조작하기

# 객체가 무엇인지는 모르지만 list라는 것이 추가로 무엇을 더 가지고 있는지 확인해 보자.

help(list)



# 리스트 라는 객체 내부에 많은 수의 함수들이 준비되어 있음을 알 수 있다. 이 함수를 불러보자.



# Line 1 에서 리스트를 생성했고 변수 l 에 객체의 주소를 할당했다. 이제 변수 l 을 통해서 우리가 생성한 리스트에 접근할 수 있다.

# Line 3의 . (period)는 무엇인가? 이것은 객체에 접근하는 . 연산자 (dor operator)로 리스트의 경우 리스트 내부에 미리 준비된 메쏘드에 접근할 수 있게 해준다. 친절한 편집기가 어떤 메쏘드를 사용할 수 있는지 보여주고 있다.


# 리스트에 요소 추가하기

# 리스트 슬라이스 표기법에 의한 요소 추가

l = ['a']

l[1:2] = 'b'

print(l)


결과)

['a', 'b']


# 증감 할당 연산자에 의한 요소 추가

t = ['hello']

t += ['world']


print(t)


결과)

['hello', 'world']


# 리스트 메쏘드에 의한 요소 추가

l = ['a']

l.append('b')

print(l)


결과)

['a', 'b']


# 리스트 인덱스 번호에 의한 요소 추가?

l = ['a']

l[1] = 'b'

print(l)


결과)

IndexError: list assignment index out of range


# 존재하지 않는 인덱스 번호로는 요소 추가를 할 수 없다. 존재하지 않는 공간의 인덱스 번호를 사용하여서 '인덱스 범위 벗어남'의 에러가 발생한다.


# 리스트 메쏘드에 의한 요소 제거

l = ['a']

l.append('b')

l.remove('b')

print(l)


결과)

['a']


# del 키워드에 의한 리스트 요소 제거 (슬라이스 범위 제거)

l = [1, 2, 3, 4, 5]


del l[1:4]


결과)

[1, 5]


# del 키워드에 의한 리스트 요소 제거 (홀수 개의 정중앙 요소 제거)

l = [1, 2, 3, 4, 5]


del l[int(len(l)/2)]


결과)

[1, 2, 4, 5]

  • 리스트에 원하는 요소가 있는지 판단하기

# in 키워드를 이용하는 방법

l = ['a']

if 'a' in l:

print('a is exist.')

else:

print('a is not exit.')


결과)

a is exist.


# 리스트의 count 메쏘드

l = ['a', 'b']

pos = l.count('a')

print(pos)


결과)

1


# 리스트 l 에 a가 첫번째 = 1 에 있는건가?

l = ['a', 'b']

pos = l.count('b')

print(pos)


결과)

1


# 리스트는 중복 요소도 허용하며 count() 메쏘드는 요소가 몇 개 있는지 알려준다.

l = ['a', 'b', 'a']

pos = l.count('a')

print(pos)


결과)

2


# 리스트의 index 메쏘드

l = ['a', 'b', 'a']

pos = l.index('a')

print(pos)


결과)

0


# 리스트의 0 번째 요소가 정말 'a' 인가?

l = ['a', 'b', 'a']

pos = l.index('a')

print(l[0])


결과)

a


# 그럼 리스트에 원하는 요소가 있는지는 어떻게 알 수 있는가?

l = ['a', 'b', 'a']

if l.count('a'): print('a Index: ' + str(l.index('a')))


결과)

a Index: 0

  • 복잡한 리스트 슬라이싱

# 명시적인 요소의 시작

l = ['1', '2', '3']

print(l[:2])


결과)

['1', '2']


# 명시적인 요소의 끝

l = ['1', '2', '3']

print(l[2:])


결과)

['3']


# 시작 요소 하나만

l = ['1', '2', '3']

print(l[:1])


결과)

['1']


l = ['1', '2', '3']

print(l[0:1])


결과)

['1']


# 마지막 요소 하나만

l = ['1', '2', '3']

print(l[-1:])


결과)

['3']


# 건너뛰면서 요소 선택하기

l = ['1', '2', '3', '4', '5']

print(l[::2])


결과)

['1', '3', '5']


l = ['1', '2', '3', '4', '5']

print(l[1::2])


결과)

['2', '4']


# 리스트 뒤집기

l = ['1', '2', '3', '4', '5']

print(l[::-1])


결과)

['5', '4', '3', '2', '1']


# 리스트 슬라이싱으로 요소 개수 원하는 만큼 잘라내기

colors = ['red', 'yellow', 'black', 'brown', 'white', 'purple']


divider = 5

startPos = 0

endPos = len(colors)


for i in range(startPos, endPos+divider, divider):

printOut = colors[startPos : i]

startPos = i

if printOut != []: print(printOut)


결과)

['red', 'yellow', 'black', 'brown', 'white']

['purple']



  • Pythnic 리스트 사용

# 일반적인 언어에서의 리스트 카운트

l = range(1, 11)


total = []

count = 0

for n in l:

    total.append(n)

    count += 1


print('total: ', total)

print('count: ', count)


결과)

total:  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

count:  10


enumerate 내장함수를 사용한 리스트 카운트

l = range(1, 11)


total = []

for c, n in enumerate(l):

    total.append(n)


print('total: ', total)

print('count: ', c + 1)


결과)

total:  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

count:  10


# len() 내장 함수를 이용한 리스트 카운트

l = range(1, 11)


total = []

for n in l:

    total.append(n)


print('total: ', total)

print('count: ', len(total))


결과)

total:  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

count:  10


# zip() 함수를 이용한 index 값 얻기

l = ['apple', 'lemon', 'grape']


print(list(zip(l, range(1, 100))))


결과)

[('apple', 1), ('lemon', 2), ('grape', 3)]


# zip() 함수로 생성한 데이터 unzip 하기

l = ['apple', 'lemon', 'grape']

u = {f: num for f, num in zip(l, range(1, 100))}

print(u)


결과)

{'grape': 3, 'lemon': 2, 'apple': 1}

  • 특수기호 모두 제거하기

# 스트링을 가지고 리스트를 만들면 개별 글자를 요소로하는 리스트 전체가 생성되고 요소비교가 가능해진다.

fruits = ['banana!', '$apple', 'peach#']


rmTarget = list('!$#')

result = []


for f in fruits:

    fList = list(f)

    for r in rmTarget:

        while True:

            try:

                fList.remove(r)

            except:

                break

    result.append(''.join(fList))


결과)

['banana', 'apple', 'peach']

 

# 동일한 로직을 스트링 조작을 이용하도록 바꿀 수 있다.

ls = ['##apple!', '!banana$', '!le$$mon#', 'peach']
filter = '!$#'

result = []

 

for l in ls:

for f in filter:

if f in l:
l = l.replace(f, '')

result.append(l)

print(result)

 

결과)

['apple', 'banana', 'lemon', 'peach']

 

# 동일한 로직을 재귀함수를 이용하도록 바꿀 수 있다.

ls = ['##apple!', '!banana$', '!le$$mon#', 'peach']
filter = '!$#'
result = []


def removeFilter(word):
    if len(word) < 1:
        return word

    if word[0] in filter:
        return removeFilter(word[1:])
    else:
        return word[0] + removeFilter(word[1:])

for l in ls:
    result.append(''.join(removeFilter(l)))

print(result)

 

결과)

['apple', 'banana', 'lemon', 'peach']


 

댓글
댓글쓰기 폼
공지사항
Total
410,766
Today
35
Yesterday
44
«   2019/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
글 보관함