상세 컨텐츠

본문 제목

리스트에 대한 기초 지식

Python

by 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 = 5startPos = 0endPos = 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 = 0for 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']

 

  • 리스트의 할당과 복사
def main():

    l1 = [1, 2, 3]
    l2 = l1

    # 두 객체는 같은 객체이다.
    print('addr of id1: ', id(l1))
    print('addr of id2: ', id(l2))
    if id(l1) == id(l2):
        print('[l1 is l2] - same object')
    else:
        print('[l1 is not l2]')

    print('\t')

    one = list(range(1, 4))
    another = one.copy()

    # 두 객체는 다른 객체이다.
    print('addr of one: ', id(one))
    print('addr of another: ', id(another))
    if id(one) == id(another):
        print('[one is another]')
    else:
        print('[one is not another] - diff. object')

    pass

if __name__ == '__main__':
    main()

# 결과

addr of id1:  2531229270592
addr of id2:  2531229270592
[l1 is l2] - same object
	
addr of one:  2531230033536
addr of another:  2531229270208
[one is not another] - diff. object

 

반응형

관련글 더보기

댓글 영역