2023. 12. 30. 16:29ㆍpython/basic
list 클래스는 Python의 기본 내장 데이터 유형입니다. 인상적이고 유용한 기능 세트가 있어 이질적인 데이터를 효율적으로 구성하고 조작할 수 있습니다. list 사용 방법을 아는 것은 Python 개발자에게 꼭 필요한 기술입니다.
Python의 list 데이터 유형 시작하기
Python의 list는 유연하고 다재다능하며 강력하고 인기 있는 내장 데이터 유형입니다. 이를 통해 객체의 가변 길이 및 변경 가능한 시퀀스를 생성할 수 있습니다. list에는 모든 유형의 개체를 저장할 수 있습니다. list요소가 동일한 유형을 공유하는 경우가 많지만 동일한 목록 내에서 다양한 유형의 개체를 혼합할 수도 있습니다.
list 객체의 보다 관련성이 높은 특성 중 일부는 다음과 같습니다.
- 순서: 특정 삽입 순서에 따라 순차적으로 정렬된 요소나 항목을 포함합니다.
- 0 기반: 0부터 시작하는 인덱스로 해당 요소에 액세스할 수 있습니다.
- 변경 가능: 포함된 요소에 대한 내부 변경 또는 변경을 지원합니다.
- 이기종: 다양한 유형의 개체를 저장할 수 있습니다.
- 확장 가능 및 동적: 동적으로 확장하거나 축소할 수 있습니다. 즉, 요소 추가, 삽입 및 제거를 지원합니다.
- 중첩 가능: 다른 list를 포함할 수 있으므로 list의 list를 가질 수 있습니다.
- 반복 가능: 반복을 지원하므로 각 요소에 대해 작업을 수행하는 동안 루프나 이해를 사용하여 순회할 수 있습니다.
- 슬라이스 가능: 슬라이싱 작업을 지원하므로 여기에서 일련의 요소를 추출할 수 있습니다.
- 결합 가능: 연결 작업을 지원하므로 연결 연산자를 사용하여 두 개 이상의 list를 결합할 수 있습니다.
- 복사 가능: 다양한 기술을 사용하여 콘텐츠의 복사본을 만들 수 있습니다.
Python에서 list는순서가 지정됩니다. 즉, 요소가 삽입된 순서대로 유지된다는 의미입니다.
colors = [
"red",
"orange",
"yellow",
"green",
"blue",
"indigo",
"violet"
]
colors
시퀀스의 위치나 인덱스를 기준으로 list의 개별 개체에 액세스할 수 있습니다. 인덱스는 0부터 시작합니다.
colors[0]
colors[1]
colors[2]
colors[3]
list에는 다양한 유형의 개체가 포함될 수 있습니다. 이것이 바로 list가 이종 컬렉션인 이유입니다.
[42, "apple", True, {"name": "John Doe"}, (1, 2, 3), [3.14, 2.78]]
Python에서 목록 구성
다음 도구 중 하나를 사용하여 목록을 만들 수 있습니다.
- list 리터럴
- list() 생성자
- list 이해
리터럴을 통해 목록 만들기
[item_0, item_1, ..., item_n]
이 구문은 대괄호 쌍으로 묶인 항목을 나열하여 n 항목 list를 생성합니다. 항목 유형이나 list 크기를 미리 선언할 필요는 없습니다. ㅣist는 크기가 가변적이며 이종 개체를 저장할 수 있다는 점을 기억하세요.
digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
fruits = ["apple", "banana", "orange", "kiwi", "grape"]
cities = [
"New York",
"Los Angeles",
"Chicago",
"Houston",
"Philadelphia"
]
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
inventory = [
{"product": "phone", "price": 1000, "quantity": 10},
{"product": "laptop", "price": 1500, "quantity": 5},
{"product": "tablet", "price": 500, "quantity": 20}
]
functions = [print, len, range, type, enumerate]
empty = []
list() 생성자 사용
list([iterable])
list를 생성하려면 클래스 생성자나 함수를 호출하는 것처럼 list()을 호출해야 합니다. iterable 주위의 대괄호는 인수가 선택 사항임을 의미하므로 대괄호는 구문의 일부가 아닙니다. . 다음은 생성자를 사용하는 방법에 대한 몇 가지 예입니다.
list((0, 1, 2, 3, 4, 5, 6, 7, 8, 9))
list({"circle", "square", "triangle", "rectangle", "pentagon"})
list({"name": "John", "age": 30, "city": "New York"}.items())
list("Pythonista")
list()
list() 생성자는 반복자 개체에서 목록을 생성해야 할 때 특히 유용합니다. 예를 들어, 피보나치 수열생성기 함수가 있다고 가정해 보겠습니다. 요청 시 list 처음 10개의 숫자를 저장해야 합니다.
def fibonacci_generator(stop):
current_fib, next_fib = 0, 1
for _ in range(0, stop):
fib_number = current_fib
current_fib, next_fib = next_fib, current_fib + next_fib
yield fib_number
fibonacci_generator(10)
list(fibonacci_generator(10))
참고: 리터럴 구문과 반복 가능한 압축 풀기 연산자( 생성자*) list()
방법은 다음과 같습니다.
이 예에서 반복 가능한 압축 풀기 연산자는 반복자를 사용하고 대괄호는 최종 숫자 list를 구성합니다. 그러나 이 기술은 list()을 사용하는 것보다 읽기 쉽고 명시적이지 않습니다.
[*fibonacci_generator(10)]
list 이해를 사용하여 list 작성
list 이해는 Python의 가장 독특한 기능 중 하나입니다. Python 커뮤니티에서 매우 인기가 높으므로 어디서나 찾을 수 있습니다. list 이해를 사용하면 for 루프를 모방하는 구문을 사용하여 단 한 줄의 코드로 list를 빠르게 만들고 변환할 수 있습니다.m
[expression(item) for item in iterable]
모든 list 이해에는 최소한 세 가지 구성 요소가 필요합니다.
- expression()은 구체적인 값을 반환하는 Python 표현식이며, 대부분의 경우 해당 값은 item 함수일 필요는 없습니다.
- item은 iterable의 현재 개체입니다.
- iterable은 list, tuple, set, string, 혹은 generator 같은 Python 반복 가능 객체일 수 있습니다.
[number ** 2 for number in range(1, 11)]
이 예에서는 range()을 사용하여 처음 10개의 정수를 가져옵니다. 이해력은 제곱을 계산하고 새 list를 작성하는 동안 반복됩니다.
목록의 항목에 액세스: 인덱싱
항목과 연결된 색인을 사용하여 list의 개별 항목에 액세스할 수 있습니다. 아이템의 인덱스란 무엇인가요? list의 각 항목에는 list에서의 해당 위치를 지정하는 색인이 있습니다. 인덱스는 0에서 시작하여 list에서 1를 뺀 항목 수까지 올라가는 정수입니다.
list_object[index]
languages = ["Python", "Java", "JavaScript", "C++", "Go", "Rust"]
languages[0]
languages[1]
languages[2]
languages[3]
languages[4]
languages[5]
list에 있는 항목 수를 list의 길이라고 합니다. 내장된 len() 함수를 사용하여 list의 길이를 확인할 수 있습니다.
len(languages)
languages[6]
Python에서는 색인 작업이 매우 유연합니다. 예를 들어, list를 색인화하는 동안 음수 색인을 사용할 수도 있습니다. 이러한 종류의 색인을 사용하면 list 항목에 역순으로 액세스할 수 있습니다.
languages[-1]
languages[-2]
languages[-6]
음수 인덱스는 0에서 시작하지 않는다는 점에 유의하는 것이 중요합니다. 음수 인덱스를 사용하면 많은 상황에서 매우 편리할 수 있습니다. 예를 들어 list의 마지막 항목에 액세스하는 것은 매우 일반적인 작업입니다. Python에서는 languages[-1]과 같이 음수 인덱스를 사용하여 이 작업을 수행할 수 있습니다.
list에는 다른 list 및 시퀀스를 포함하여 모든 유형의 항목이 포함될 수 있습니다. 다른 시퀀스가 포함된 list가 있는 경우 인덱싱 작업을 연결하여 중첩된 시퀀스의 항목에 액세스할 수 있습니다.
employees = [
("John", 30, "Software Engineer"),
("Alice", 25, "Web Developer"),
("Bob", 45, "Data Analyst"),
("Mark", 22, "Intern"),
("Samantha", 36, "Project Manager")
]
list_of_sequences[index_0][index_1]...[index_n]
각 색인 끝에 있는 숫자는 list의 중첩 수준을 나타냅니다. 예를 들어 직원 목록에는 한 가지 수준의 중첩이 있습니다. 따라서 Alice의 데이터에 액세스하려면 다음과 같이 할 수 있습니다.
employees[1][0]
employees[1][1]
employees[1][2]
중첩된 항목이 dict인 경우 키를 사용하여 해당 데이터에 액세스할 수 있습니다.
employees = [
{"name": "John", "age": 30, "job": "Software Engineer"},
{"name": "Alice", "age": 25, "job": "Web Developer"},
{"name": "Bob", "age": 45, "job": "Data Analyst"},
{"name": "Mark", "age": 22, "job": "Intern"},
{"name": "Samantha", "age": 36, "job": "Project Manager"}
]
employees[3]["name"]
employees[3]["age"]
employees[3]["job"]
이 예에는 사전 목록이 있습니다. 사전 중 하나의 데이터에 액세스하려면 list에서 해당 인덱스를 사용해야 하며 그 뒤에 대괄호로 묶인 대상 키가 와야 합니다.
목록에서 여러 항목 검색: 분할
목록 작업 시 또 다른 일반적인 요구 사항은 주어진 목록의 일부 또는 조각을 추출하는 것입니다. 다음 구문을 사용하는 슬라이싱 작업을 사용하여 이 작업을 수행할 수 있습니다.
list_object[start:stop:step]
이 구성의 [start:stop:step] 부분은 슬라이싱 연산자로 알려져 있습니다. 구문은 한 쌍의 대괄호와 세 개의 선택적 인덱스(start, stop 및 step)로 구성됩니다. 두 번째 콜론은 선택사항입니다. 일반적으로 step 1과 다른 값이 필요한 경우에만 사용합니다.
참고: 슬라이싱은 목록, 튜플, 문자열, 범위 등을 포함한 모든 Python 시퀀스 데이터 유형에 공통적인 작업입니다.
슬라이싱 연산자의 인덱스의 의미는 다음과 같습니다.
- start : 슬라이싱을 시작하려는 인덱스를 지정합니다. 결과 조각에는 이 인덱스의 항목이 포함됩니다.
- stop : 슬라이싱에서 항목 추출을 중지하려는 인덱스를 지정합니다. 결과 조각에는 이 인덱스의 항목이 포함되지 않습니다.
- step : 각 단계에서 분할이 건너뛸 항목 수를 나타내는 정수 값을 제공합니다. 결과 조각에는 건너뛴 항목이 포함되지 않습니다.
슬라이싱 연산자의 모든 인덱스는 선택 사항입니다. 기본값은 다음과 같습니다.
색인기본값start | 0 |
stop | len(list_object) |
step | 1 |
인덱싱 연산자의 최소 작동 변형은 [:]입니다. 이 변형에서는 모든 인덱스의 기본값을 사용하고 두 번째 콜론이 선택 사항이라는 사실을 활용합니다. [::] 슬라이싱 연산자의 변형은 [:]과 동일한 결과를 생성합니다. 이번에는 세 가지 지수의 기본값을 사용합니다.
letters = ["A", "a", "B", "b", "C", "c", "D", "d"]
upper_letters = letters[0::2] # Or [::2]
upper_letters
lower_letters = letters[1::2]
lower_letters
첫 번째 슬라이싱에서는 목록의 맨 처음부터 시작하려고 하기 때문에 0에서 출발을 사용합니다. 두 번째 슬라이싱에서는 첫 번째 항목을 뛰어넘어 두 번째 항목에서 항목 추출을 시작해야 하기 때문에 1에서 출발을 사용합니다.
digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
first_three = digits[:3]
first_three
middle_four = digits[3:7]
middle_four
every_other = digits[::2]
every_other
every_three = digits[::3]
every_three
모든 슬라이싱 작업은 내부적으로 slice 개체를 사용합니다. 내장된 slice() 함수는 목록에서 여러 항목을 추출하는 데 사용할 수 있는 slice 개체를 생성하는 대체 방법을 제공합니다. 이 내장 함수의 서명은 다음과 같습니다.
slice(start, stop, step)
letters = ["A", "a", "B", "b", "C", "c", "D", "d"]
upper_letters = letters[slice(0, None, 2)]
upper_letters
- start가 list의 시작 부분 앞에 있으면(음수 인덱스를 사용할 때 발생할 수 있음) Python은 대신 0를 사용합니다.
- start이 stop보다 큰 경우 슬라이싱은 빈 list를 반환합니다.
- stop이 list
colors = [
"red",
"orange",
"yellow",
"green",
"blue",
"indigo",
"violet"
]
len(colors)
colors[-8:]
colors[8:]
colors[:8]
list 복사본 만들기
list의 별칭
countries = ["United States", "Canada", "Poland", "Germany", "Austria"]
nations = countries
id(countries) == id(nations)
countries[0] = "United States of America"
nations
이 코드 조각에서 강조 표시된 첫 번째 줄은 countries의 별칭으로 nations을 만듭니다. 두 변수가 어떻게 동일한 객체를 가리키는지 확인하세요. 객체의 ID가 동일하기 때문에 이를 알 수 있습니다. 강조 표시된 두 번째 줄에서는 countries의 인덱스에 있는 개체를 업데이트합니다. 이 변경 사항은 nations 별칭에 반영됩니다.
list의 얕은 복사본
list의 얕은 복사본을 만들면 Python은 새로운 ID로 새 list를 구성합니다. 그런 다음 원래 list의 개체에 대한 참조를 새 list에 삽입합니다.
기존 list의 얕은 복사본을 만드는 방법에는 최소한 세 가지가 있습니다.
- 슬라이싱 연산자,[:]
- .copy() 방법
- copy 모듈의 copy() 함수
countries = ["United States", "Canada", "Poland", "Germany", "Austria"]
nations = countries[:]
nations
id(countries) == id(nations)
id(nations) == id(countries)
그러나 nations의 요소는 countries 요소의 별칭입니다.
id(nations[0]) == id(countries[0])
id(nations[3]) == id(countries[3])
countries[0] = "United States of America"
countries
nations
id(countries[0]) == id(nations[0])
id(countries[1]) == id(nations[1])
list 복사본을 만드는 것은 매우 일반적인 작업이기 때문에 list 클래스에는 이를 위한 전용 메서드가 있습니다. 이 메소드는 .copy()라고 불리며 대상 list의 얕은 복사본을 반환합니다.
countries = ["United States", "Canada", "Poland", "Germany", "Austria"]
nations = countries.copy()
nations
id(countries) == id(nations)
id(countries[0]) == id(nations[0])
countries[0] = "United States of America"
countries
nations
list의 얕은 복사본을 만드는 또 다른 도구를 찾을 수 있습니다. 모듈의 copy() 함수를 사용하면 다음과 같은 작업을 수행할 수 있습니다.
from copy import copy
countries = ["United States", "Canada", "Poland", "Germany", "Austria"]
nations = copy(countries)
nations
id(countries) == id(nations)
id(countries[0]) == id(nations[0])
countries[0] = "United States of America"
countries
nations
목록의 전체 복사본
기존 list의 전체 복사본을 생성하려면 모듈의 deepcopy() 함수를 사용할 수 있습니다.
from copy import deepcopy
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
matrix_copy = deepcopy(matrix)
id(matrix) == id(matrix_copy)
id(matrix[0]) == id(matrix_copy[0])
matrix_copy[0][0] = 100
matrix_copy[0][1] = 200
matrix_copy[0][2] = 300
matrix_copy
matrix
matrix_copy 또는 기타 전체 복사의 변경 사항이 matrix의 콘텐츠에 영향을 주지 않습니다.
list의 항목 업데이트: 색인 할당
Python list는 변경 가능 데이터 유형입니다. 이는 기본 list의 ID를 변경하지 않고도 해당 요소를 변경할 수 있음을 의미합니다. 이러한 종류의 변경을 일반적으로 내부 돌연변이라고 합니다. 기존 list에 있는 하나 이상의 항목 값을 업데이트할 수 있습니다.
list_object[index] = new_value
인덱싱 연산자를 사용하면 해당 인덱스를 통해 대상 항목에 액세스할 수 있고 할당 연산자를 사용하면 현재 값을 변경할 수 있습니다.
numbers = [1, 2, 3, 4]
numbers[0] = "one"
numbers
numbers[-1] = "four"
numbers
항목의 가치를 알고 있지만 list에 있는 항목의 색인을 모르는 경우 어떻게 해야 합니까?
fruits = ["apple", "banana", "orange", "kiwi", "grape"]
fruits[fruits.index("kiwi")] = "mango"
fruits
.index() 메소드는 특정 항목을 인수로 사용하고 기본 list에서 해당 항목이 처음 나타나는 색인을 반환합니다.
또한 여러 list 항목의 값을 한 번에 업데이트할 수도 있습니다. 그렇게 하려면 슬라이싱 연산자를 사용하여 항목에 액세스한 다음 할당 연산자와 새 값의 반복 가능 항목을 사용하면 됩니다. 이러한 연산자 조합을 줄여서 슬라이스 할당이라고 할 수 있습니다.
list_object[start:stop:step] = iterable
numbers = [1, 2, 3, 4, 5, 6, 7]
numbers[1:4] = [22, 33, 44]
numbers
iterable에 대상 슬라이스보다 더 많거나 적은 요소가 있는 경우 list_object는 그에 따라 자동으로 늘어나거나 줄어듭니다.
numbers = [1, 5, 6, 7]
numbers[1:1] = [2, 3, 4]
numbers
슬라이스를 사용하여 기존 목록을 축소할 수도 있습니다.
numbers = [1, 2, 0, 0, 0, 0, 4, 5, 6, 7]
numbers[2:6] = [3]
numbers
여기서 초기 list에는 3이 있어야 하는 곳에 0이 많이 있습니다. 슬라이싱 연산자는 0으로 채워진 부분을 가져와 단일 3으로 바꿉니다.
동적으로 list 확장 및 축소
Python list에서 가변성은 항목을 제자리에서 수정하는 것을 허용하는 것 이상입니다. list는 변경 가능하므로 요소를 추가하거나 제거하여 즉시 길이를 변경할 수 있습니다. 따라서 이미 배웠듯이 list는 가변 길이 컨테이너이기도 합니다.
한 번에 단일 항목 추가:.append()
이 메소드는 한 번에 하나의 항목을 가져와 대상 list는 오른쪽 끝에 추가합니다.
pets = ["cat", "dog"]
pets.append("parrot")
pets
.append() 사용은 다음 슬라이스 할당을 수행하는 것과 같습니다.
pets[len(pets):] = ["hawk"]
pets
pets.append(["hamster", "turtle"])
pets
pets의 마지막 항목이 두 마리의 새로운 독립 애완동물이 아닌 두 마리의 애완동물 list이라는 점에 유의하세요.
한 번에 여러 항목으로 목록 확장:.extend()
list 작업을 할 때 목록 오른쪽 끝에 여러 항목을 한 번에 추가해야 할 수도 있습니다. 이는 매우 일반적인 요구 사항이므로 Python의 list에는 해당 작업을 위한 전용 메서드가 있습니다.
fruits = ["apple", "pear", "peach"]
fruits.extend(["orange", "mango", "banana"])
fruits
.extend()은 모든 반복 가능 항목을 인수로 사용할 수 있다는 점에 유의해야 합니다. 따라서 튜플, 문자열, 사전 및 해당 구성 요소, 반복자, 심지어 세트를 사용할 수 있습니다.
fruits = ["apple", "pear", "peach"]
fruits[len(fruits):] = ["orange", "mango", "banana"]
fruits
주어진 위치에 항목 삽입:.insert()
.insert() 방법은 기존 list에 항목을 추가하는 데 사용할 수 있는 또 다른 도구입니다. 이 방법은 .append() 및 .extend()과는 약간 다릅니다. list의 오른쪽 끝에 항목을 추가하는 대신 .insert()을 사용하면 항목을 넣을 위치를 결정할 수 있습니다. 즉, .insert()는 두 가지 인수를 취합니다:
- index: 항목을 삽입하려는 인덱스
- item: list에 삽입해야 하는 항목
letters = ["A", "B", "F", "G"]
letters.insert(2, "C")
letters
letters[3:3] = ["D"]
letters
list에서 항목 삭제
Python을 사용하면 기존 목록에서 하나 이상의 항목을 제거할 수도 있습니다. 다시 말하지만, 목록에서 항목을 삭제하는 것은 매우 일반적인 작업이므로 list 클래스에 이미 메서드가 있어 이를 수행하는 데 도움이 됩니다. 다음과 같은 방법이 있습니다.
.remove(item) | list에서 처음 나타나는 item을 제거합니다. 해당 항목이 없으면 ValueError 발생합니다. |
.pop([index]) | index에서 항목을 제거하고 호출자에게 다시 반환합니다. 대상 index을 제공하지 않으면 .pop()은 list의 마지막 항목을 제거하고 반환합니다. index 주위의 대괄호는 인수가 선택 사항임을 의미합니다. 대괄호는 구문의 일부가 아닙니다. |
.clear() | list에서 모든 항목을 제거합니다. |
.remove() 메소드는 list에서 항목을 제거하려고 하지만 항목의 색인을 모르는 경우에 유용합니다. 동일한 값을 가진 항목이 여러 개 있는 경우 .remove() 항목이 발생한 횟수만큼 호출하여 모든 항목을 제거할 수 있습니다.
sample = [12, 11, 10, 42, 14, 12, 42]
sample.remove(42)
sample
sample.remove(42)
sample
.pop() 메소드를 사용하면 해당 색인을 사용하여 특정 항목을 제거하고 반환할 수 있습니다. 색인 없이 메소드를 호출하면 기본 list의 마지막 항목이 제거되고 반환됩니다.
to_visit = [
"https://realpython.com",
"https://python.org",
"https://stackoverflow.com",
]
visited = to_visit.pop()
visited
to_visit
visited = to_visit.pop(0)
visited
to_visit
visited = to_visit.pop(-1)
visited
to_visit
list에서 모든 항목을 한 번에 제거하는 것도 빈번한 작업일 수 있습니다. 이 경우 Python에서는 list에 정확히 해당 작업을 수행하는 .clear()라는 메서드가 있기 때문에 이를 처리합니다.
cache = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
cache.clear()
cache
다음 슬라이스 할당은 .clear() 메소드와 동일한 결과를 생성합니다.
cache = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
cache[:] = []
cache
기존 list에서 하나 이상의 항목을 제거하는 데 사용할 수 있는 Python 도구가 하나 더 있습니다. 예, 그게 del 진술입니다. del 인덱싱 또는 슬라이싱 작업을 결합하여 각각 하나의 항목 또는 여러 항목을 제거할 수 있습니다
colors = [
"red",
"orange",
"yellow",
"green",
"blue",
"indigo",
"violet"
]
del colors[1]
colors
del colors[-1]
colors
del colors[2:4]
colors
del colors[:]
colors
'python > basic' 카테고리의 다른 글
Python에서 목록 이해(list comprehension)를 사용해야 하는 경우 (0) | 2024.01.02 |
---|---|
Python의 list 데이터 유형-예제를 통한 심층 분석2 (1) | 2023.12.31 |
일반적인 Python 데이터 구조(가이드)2 (1) | 2023.12.29 |
일반적인 Python 데이터 구조(가이드)1 (0) | 2023.12.28 |
함수 정의 시 Python 선택적 인수 사용 (1) | 2023.12.27 |