흔한말 (collection)/Python

파이썬 리스트 조작법 및 관련함수 보고가세요!

hnanmal 2022. 4. 20. 23:13
300x250
리스트! 영어 단어로 들을 때는 단지 목록인데, 프로그래밍 배우면서 들을 때는 왜 그렇게 부담스러울까요?

이제부터는 발상의 전환으로

 

너무 좋은 성능의 우리 두뇌는 시키지 않아도 보고들은 목록들을 자연스럽게 처리하지만,
컴퓨터는 아둔해서 일일이 목록을 다루는 명령을 아주 아주 구체적으로 내려줘야 한다고 생각합시다.

 

 

지금부터는 신입사원을 지도해야 하는 부장의 마음으로,
윗 직급 되기 워크숍을 온 것처럼
컴퓨터에게 명령하는 법을 배워봅시다.

 

 

 

형식은 이렇습니다

리스트를 어디서 받아올 수도 있지만, 우리가 하드코딩으로 직접 데이터를 주입해서 알려줄 수도 있습니다.

 

숫자리스트 = [1, 2, 3, 4, 5]
문자리스트 = ["사과", "기린", "호수"]
객체리스트 = [
        {"name": "코코", "나이": 3, "성격": "온순"},
        {"name": "치치", "나이": 5, "성격": "쾌활"},
        {"name": "랄루", "나이": 7, "성격": "차분"}
    ]

 

 

 

각각의 원소 접근해서 값을 가져오고 싶어요

숫자리스트 = [1, 2, 3, 4, 5]
문자리스트 = ["사과", "기린", "호수"]
객체리스트 = [
        {"name": "코코", "나이": 3, "성격": "온순"},
        {"name": "치치", "나이": 5, "성격": "쾌활"},
        {"name": "랄루", "나이": 7, "성격": "차분"}
    ]
print(숫자리스트[0], 숫자리스트[1], 숫자리스트[-1], 숫자리스트[-2])
print(문자리스트[0], 문자리스트[-1])
print(객체리스트[1])
print(객체리스트[1]["성격"])

#문자리스트의 마지막 원소 변경
문자리스트[2] = '코끼리'
print(문자리스트)
1 2 5 4
사과 호수
{'name': '치치', '나이': 5, '성격': '쾌활'}
쾌활
['사과', '기린', '코끼리']

 

각각의 리스트에서 원하는 순서에 있는 값을 가져오고 싶을 때, 위의 예제를 참고해서 코딩하시면 됩니다.

객체에 있는 속성을 소환하고 싶으면, 객체에 대괄호를 붙이고 그 안에 속성 이름을 넣으시면 됩니다.

 

 

 

슬라이싱으로 리스트의 일부를 잘라내서 간직하고 싶어요

숫자리스트 = [1, 2, 3, 4, 5]
문자리스트 = ["사과", "기린", "코끼리"]

print (숫자리스트[1:2])    #1번 부터 2번 전 까지
print (문자리스트[1:])     #1번 부터 끝 까지

## 응용-일부구간 값 변경
숫자리스트[1:3] = [10, 100]
print(숫자리스트)
[2]
['기린', '코끼리']
[1, 10, 100, 4, 5]

이번에는 잘라내기입니다.
리스트를 잘라내서 필요한 부분만 남기는 방식이고, :(콜론)을 사용해서 자를 범위를 지정한다고 기억하시면 됩니다.

 

 

 

원소를 삭제해 버릴 거예요

숫자리스트 = [1, 2, 3, 4, 5]
문자리스트 = ["사과", "기린", "코끼리"]

del 숫자리스트[:3]
del 문자리스트[2]

print(숫자리스트)
print(문자리스트)
[4, 5]
['사과', '기린']

어렵지 않죠?
del 구문을 써서 리스트의 원하는 인덱스를 지정하면 됩니다.

 

 

 

리스트 안쪽의 리스트, 다중 리스트를 구현

숫자리스트 = [1, 2, 3, 4, 5]

다중리스트 = ["사과", "기린", "코끼리", 숫자리스트]

print(다중리스트)
print(다중리스트[0], 다중리스트[1], 다중리스트[2], 다중리스트[3][0], 다중리스트[3][2], 다중리스트[-1][-1])
['사과', '기린', '코끼리', [1, 2, 3, 4, 5]]
사과 기린 코끼리 1 3 5

다중 리스트에서 원소가 리스트일 때는,
인덱스를 통해 2번 접근해야 최종 원소의 값을 얻을 수 있다는 것만 기억하시면 됩니다.

 

 

 

리스트를 몇 번이고 반복해서 수를 부풀릴 거예요

목록 = ['^^','ㅠㅠ']
반복결과 = 목록 * 5

print(반복결과)
['^^', 'ㅠㅠ', '^^', 'ㅠㅠ', '^^', 'ㅠㅠ', '^^', 'ㅠㅠ', '^^', 'ㅠㅠ']

상황에 따라서
원소 개수가 적은 리스트의 원소들을,
원소개수가 많은 리스트의 개수와 맞춰주기 위해 리스트의 원소들을 반복해야 하는 경우가 있습니다.

 

그럴 때는 곱셈 연산자를 사용해서 리스트의 값이 담겨있는 변수명에 곱셈을 해버리면 됩니다.
(단 이런 경우에는 float을 곱할 수 없고 오직 int자료형만 곱할 수 있습니다.)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

리스트 자료형이 갖고 있는 내장 함수 탐구하기

리스트라는 자료형 자체는 파이썬에서 클래스로 구현되어 있습니다.
클래스에 내장되어 리스트의 특성을 추출하거나, 리스트 자체를 보정하는 내장 함수들을 알아보겠습니다.

 

 

길이: len( X )

숫자목록 = [7, 3, 6, 5, 9, 4, 5, 5, 1]

print("숫자목록 길이 : ", len(숫자목록))
숫자목록 길이 :  9

 

 

정렬: X.sort( )

숫자목록 = [7, 3, 6, 5, 9, 4, 5, 5, 1]
문자목록 = ['강의', '냉장고', 'stock', '공부', 'meme','땔감', '원숭이']

print(숫자목록)
print(문자목록)

숫자목록.sort()
문자목록.sort()

print(숫자목록)
print(문자목록)
[7, 3, 6, 5, 9, 4, 5, 5, 1]
['강의', '냉장고', 'stock', '공부', 'meme', '땔감', '원숭이']
[1, 3, 4, 5, 5, 5, 6, 7, 9]
['meme', 'stock', '강의', '공부', '냉장고', '땔감', '원숭이']

 

 

순서를 거꾸로: X.reverse( )

숫자목록 = [7, 3, 6, 5, 9, 4, 5, 5, 1]

숫자목록.sort()  # 정순
print(숫자목록)

숫자목록.reverse()  # 역순
print(숫자목록)
[1, 3, 4, 5, 5, 5, 6, 7, 9]
[9, 7, 6, 5, 5, 5, 4, 3, 1]

 

 

포함된 원소의 개수: X.count( )

숫자들 = [12, 1229, 2, 5252, 2918, 2, 202, 22022, -22]
문자들 = ['땔감', '기초', '신세계', '잔머리', '메롱', '메롱']

print('2의 개수는? :', 숫자들.count(2))
print('-2의 개수는? :', 숫자들.count(-2))
print('메롱의 개수는? :', 문자들.count('메롱'))
2의 개수는? : 2
-2의 개수는? : 0
메롱의 개수는? : 2

 

 

요소 추가: X.append( )

리스트에 원소를 추가하고 싶다면 가장 먼저 떠올릴 수 있는 내장 함수가 바로 append입니다.
리스트의 마지막에 추가해 줍니다.

어떤리스트 = ['라떼는','말이야']

어떤리스트.append('주말에도')
어떤리스트.append('선배가')
어떤리스트.append('부르면')
어떤리스트.append('출근했어!!!')
print(어떤리스트)
['라떼는', '말이야', '주말에도', '선배가', '부르면', '출근했어!!!']

 

 

확장: X.extend( )

만약에 어떤리스트에 추가하려는 자료형도 리스트라면, 그리고 다중 구조를 피하고 1차원 리스트로 결과물을 만들고 싶다면?
append( ) 말고 extend( ) 함수를 사용하는 것이 현명합니다. (리스트가 아닌 단일 값을 넣어서도 테스트해보세요.)

print(어떤리스트)

어떤리스트.extend(['예끼','이눔아!!!'])

print(어떤리스트)
['라떼는', '말이야', '주말에도', '선배가', '부르면', '출근했어!!!']
['라떼는', '말이야', '주말에도', '선배가', '부르면', '출근했어!!!', '예끼', '이눔아!!!']

 

 

중간에 요소 삽입: X.insert( )

이번에는 새로운 요소를 리스트의 마지막이 아닌, 특정 위치를 지정해서 집어넣어 봅시다.

배댓슈 = ['배트맨','슈퍼맨']

배댓슈.insert(1,'vs') 
print(배댓슈)
['배트맨', 'vs', '슈퍼맨']

 

장보기목록 = ['주방세제', '인덕션냄비','손세정제','양말세트', '라탄냄비받침']
먹을거리 = ['토마토', '곤드레나물', '마늘쫑', '닭가슴살']
장보기목록.insert(2, 먹을거리)

print(장보기목록)
['주방세제', '인덕션냄비', ['토마토', '곤드레나물', '마늘쫑', '닭가슴살'], '손세정제', '양말세트', '라탄냄비받침']

 

 

 

원소 삭제: X.remove( )

친구목록 = ['원빈','김명민', '나카가와 타이시', '마동석','박중훈','윤계상','장동건','송위룡']

친구목록.remove('나카가와 타이시')
친구목록.remove('송위룡')

print(친구목록)
['원빈', '김명민', '마동석', '박중훈', '윤계상', '장동건']

 

print(장보기목록)

장보기목록.remove(['토마토', '곤드레나물', '마늘쫑', '닭가슴살'])

print(장보기목록)
['주방세제', '인덕션냄비', ['토마토', '곤드레나물', '마늘쫑', '닭가슴살'], '손세정제', '양말세트', '라탄냄비받침']
['주방세제', '인덕션냄비', '손세정제', '양말세트', '라탄냄비받침']

 

 

 

원소를 밖으로 꺼내고, 리스트에서는 삭제: X.pop( )

친구목록 = ['원빈','김명민', '나카가와 타이시', '마동석','박중훈','윤계상','장동건','송위룡']

반환요소1 = 친구목록.pop()     #마지막 요소 반환 후 제거
반환요소2 = 친구목록.pop(2)    #index2 요소 삭제

print(친구목록)
print(반환요소1+"&"+반환요소2)
['원빈', '김명민', '마동석', '박중훈', '윤계상', '장동건']
송위룡&나카가와 타이시

 

반환요소1과 반환요소2의 값을 보면 알 수 있듯이, 리스트에서 pop함수를 적용한 결과를 변수에 할당하면 pop의 대상이 따로 저장됨을 알 수 있습니다.
리스트에서 그냥 삭제하는 것이 아니라, 삭제하기 전 어떤 작업을 하고 사라져야 하는 상황이라면 pop함수를 사용하는 것이 훨씬 유용합니다.

 

 

 

원소의 인덱스 찾기: X.index( )

print(친구목록)

print (친구목록.index('마동석'))
print (친구목록.index('장동건',0,3))
['원빈', '김명민', '마동석', '박중훈', '윤계상', '장동건']
2





ValueErrorTraceback (most recent call last)

<ipython-input-18-56a1d8cdd61a> in <module>
      2 
      3 print (친구목록.index('마동석'))
----> 4 print (친구목록.index('장동건',0,3))


ValueError: '장동건' is not in list

index() 함수에 인자로 마지막 2개의 숫자를 주는 것은 검색 범위를 지정하는 것입니다.
범위에 없는 항목을 검색하면 당연히 에러가 나겠죠?

 

 

시간표 = ["수학", "수학", "영어", "과학", "국어", "영어"]

print (시간표.index('영어'))

만약 리스트에 중복되는 원소가 있다면 인덱스 찾기에서는 가장 앞쪽에 있는 인덱스만 반환해 줍니다.
해당하는 값의 모든 인덱스를 찾고 싶다면 filter 함수나 enumerate함수를 사용하여 간단한 코드를 작성하는 것이 좋습니다.

반응형