[파이썬 자료구조] 리스트 List

서대철·2023년 7월 18일
0

파이썬에서 리스트는 특정 순서로 요소들을 저장하는 다재다능하고 기본적인 데이터 구조입니다. 리스트는 가변적이며, 생성된 후에도 내용을 수정할 수 있습니다. 이러한 유연성과 사용 편의성으로 인해 리스트는 파이썬에서 가장 자주 사용되는 데이터 구조 중 하나입니다.

파이썬의 리스트의 주요 특징:

  1. 순서가 있다(ordered): 리스트는 요소들의 추가 순서를 유지합니다. 첫 번째로 추가된 요소가 리스트의 첫 번째 요소가 되고, 그 뒤로 순서대로 추가됩니다.

  2. 가변적이다(mutable): 리스트는 생성 후에도 요소들을 수정할 수 있습니다. 요소를 추가, 제거, 변경할 수 있습니다.

  3. 이질적 요소를 담을 수 있다(heterogeneous elements): 리스트는 서로 다른 데이터 유형의 요소를 포함할 수 있습니다. 예를 들어, 정수, 문자열, 실수, 또는 다른 리스트까지 포함할 수 있습니다.

리스트 생성:

fruits = ["apple", "banana", "orange", "grape"]
empty_list = []

요소 접근:

fruits = ["apple", "banana", "orange", "grape"]
length_of_fruits = len(fruits)   # list의 길이
print(length_of_fruits)  # Output: 4
print(fruits[0])  # 출력: apple
print(fruits[-1])  # 출력: grape (음수 인덱스는 뒤에서부터 카운트)
searchIndex = fruits.index('banana')   # 'banana'의 인덱스 값

요소 수정:

fruits[1] = "pear"
print(fruits)  # 출력: ["apple", "pear", "orange", "grape"]

요소 추가:

fruits.append("kiwi")  # "kiwi"를 리스트 끝에 추가
fruits.insert(2, "mango")  # "mango"를 인덱스 2에 삽입
print(fruits)  # 출력: ["apple", "pear", "mango", "orange", "grape", "kiwi"]

요소 제거:

fruits.remove("orange")  # "orange"를 리스트에서 제거
del fruits[0]  # 인덱스 0의 요소를 제거
fruits.pop(1)  # 인덱스 1의 요소를 제거
print(fruits)  # 출력: ["pear", "grape", "kiwi"]

요소 순회:

for fruit in fruits:
    print(fruit)

리스트 연결:

fruits = ["apple", "banana", "orange", "grape"]
vegetable = ["cabbage", "carrot", "onion"]
fruits_vegetable = fruits + vegetable
fruits.extend(vegetable)

리스트 정렬(오름차순, 내림차순):

students = ['David', 'Kevin', 'Jenny', 'Alex']
students.sort()   # 오름차순 정렬
students.sort(reverse=True)    # 내림차순 정렬

리스트 뒤집기:

students = ['David', 'Kevin', 'Jenny', 'Alex']
students.reverse()   # 출력: ['Alex', 'Jenny', 'Kevin', 'David']

리스트 슬라이싱:

students = ['David', 'Kevin', 'Jenny', 'Alex', 'Andrew']

print(students[1:3])   # 출력: ['Kevin', 'Jenny']

print(students[:3]    # 출력: ['David', 'Kevin', 'Jenny']

print(students[3:]    # 출력: ['Alex', 'Andrew']

리스트는 데이터 모음을 저장하고, 알고리즘 구현, 대용량 데이터 처리 등 다양한 작업에 매우 유용합니다. 또한 리스트는 스택, 큐, 링크드 리스트 등의 더 복잡한 데이터 구조를 구현하는 데 기본적인 구성 요소입니다. 리스트와 리스트의 연산에 대한 이해는 파이썬 프로그래밍을 능숙하게 하기 위해 꼭 필요한 기술입니다.

리스트 자료구조는 특히 for/while 반복문과 밀접하게 사용됩니다. 아래와 같이 nested list를 for문을 사용해 접근할 수 있습니다.

nested_list = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]

# Using a single for loop to access both elements of each sublist
for element1, element2 in nested_list:
    print(f'First element: {element1}, Second element: {element2}')

또한, 이런 중첩 리스트는 다음과 같이 인덱싱할 수 있습니다.

nested_list[0][1]

물론, 나중에 나오겠지만 이런 자료형의 경우 딕셔너리가 더 효과적일 수 있겠습니다.

또 하나의 예시는, for 문을 이용해 리스트에 포함된 숫자 요소 중 가장 작은 값과 가장 큰 값을 출력하는 방법입니다.

import random

myList = random.sample(range(100), 6)   # 6 random numbers ranging 0 to 99
print('myList: {}' .format(myList))

minNum = myList[0]
maxNum = myList[0]

for element in myList:
    if element < minNum:
        minNum = element

    if element > maxNum:
        maxNum = element

print('minNum: {}' .format(minNum))
print('maxNum: {}' .format(maxNum))

enumerate() 함수는 Python의 내장 메서드로, 리스트(또는 다른 반복 가능한 객체)를 순회하면서 현재 처리 중인 항목의 인덱스를 추적하는 데 사용됩니다. 이 함수는 인덱스와 해당 항목을 튜플로 반환하는 반복자(iterator)를 생성합니다. enumerate()의 구문은 다음과 같습니다:

enumerate(iterable, start=0)
  • iterable: 반복하고자 하는 리스트 또는 다른 반복 가능한 객체입니다.
  • start (선택적): 선택적 매개변수로, 시작 인덱스를 지정합니다. 기본값은 0이며, 다른 값으로 지정할 수 있습니다.

enumerate() 함수를 사용하면 리스트를 순회하면서 인덱스와 해당 요소에 모두 접근할 수 있습니다. 별도의 카운터를 수동으로 관리하는 대신 enumerate()를 사용하면 코드가 더 간결하고 가독성이 좋아집니다.

아래는 리스트에서 enumerate()를 사용하는 예제입니다:

fruits = ['사과', '바나나', '오렌지', '포도']

for index, fruit in enumerate(fruits):
    print(f"{index}번째 과일은 {fruit}입니다.")

출력 결과:

0번째 과일은 사과입니다.
1번째 과일은 바나나입니다.
2번째 과일은 오렌지입니다.
3번째 과일은 포도입니다.

위 예제에서 enumerate(fruits)는 fruits 리스트의 (인덱스, 과일)로 구성된 튜플을 생성하는 반복자(iterator)를 반환합니다. for 루프는 이러한 튜플을 순회하며 변수 index와 fruit에 각각 해당 튜플의 값들을 할당합니다. 이를 통해 루프 본문에서 인덱스와 요소에 모두 쉽게 접근할 수 있습니다.

enumerate() 함수를 사용하면 리스트 요소와 인덱스를 동시에 다루어야 할 때 코드가 더 깔끔하고 간단해지며, 특히 작업의 효율성과 가독성을 향상시킬 수 있습니다.


List에서 활용가능한 부가 기능들
1. 특정 요소의 개수 파악: count()

nameList = ['강호동', '유재석', '홍길동', '강호동']
print(nameList.count('강호동'))   # returns: 2
  1. 불필요한 아이템의 삭제: del
toDelete = nameList.index('강호동')   # '강호동'의 인덱스 1개 리턴
del nameList[toDelete]   # '강호동' 1개 삭제

0개의 댓글