수달이네 기술 블로그

8. 리스트2(리스트 관련 함수들, 리스트 함축...) 본문

언어/Python

8. 리스트2(리스트 관련 함수들, 리스트 함축...)

슬픈 수달이 2025. 8. 26. 16:46

🔍리스트 함수들

del 리스트[:]: 리스트 요소 삭제

heros = ["superman", "spiderman","batman"]
del heros[:]
print(heros)

del키워드를 이용해 [인덱스]의 요소를 삭제할 수 있다. 

마찬가지로 ':(콜론)'을 이용하여 start:end요소를 삭제할 수 있으며, 입력을 하지 않을 경우 전체 삭제가 가능하다.

리스트.clear(): 모든 요소 제거

heros = ["superman", "spiderman","batman"]
heros.clear()
print(heros)

del[:]과 같은 기능을 한다.

리스트.count(): 특정 요소의 개수 알아내기

heros = ["superman", "spiderman","batman"]
cnt = heros.count("superman")
print(cnt)
#1

리스트 내의 (요소)의 개수를 알아낼 수 있음.

리스트.extend(): 리스트 두개를 이어 붙일 수 있음(+ 연산과 같은 연산)

heros = ["superman", "spiderman","batman"]
villans = ["joker", "Dr.Octopus"]

heros.extend(villans)
print(heros)

#['superman', 'spiderman', 'batman', 'joker', 'Dr.Octopus']

리스트 두개를이어 붙이는 연산.


🔍얕은 복사, 깊은 복사

일반적으로 변수 = 변수를 이용하면 해당 변수가 복사된다.

그러나 해당 변수의 내용이 복사되는 것이 아닌 해당 변수의 주소만 복사되는 것인데,

heros = ["superman", "spiderman","batman"]
villans = ["joker", "Dr.Octopus"]

hero2 = heros
hero2 += villans

print(heros)

#['superman', 'spiderman', 'batman', 'joker', 'Dr.Octopus']

위의 코드를 살펴보면 분명 hero2 변수에 villans변수를 연결해 주었지만, heros 변수에도 영향이 간 것을 확인할 수 있다.

그 이유는 위에서 말했듯이 변수의 주소만 복사되었기 때문이다.

이 이유는 '얕은 복사'를 했기 때문이다.

score = 100

myScore = score

myScore -= 30

print(myScore, score)
#70 100

위의 코드는 똑같은 방식으로 복사를 했지만, 이전에 말한 mutable object가 아니므로 myscore의 주소가 변경된다.

 

그렇다면 얕은 복사가 아닌 깊은 복사를 하려면 어떻게 해야 할까?

1. list() 메서드

heros = ["superman", "spiderman","batman"]
villans = ["joker", "Dr.Octopus"]

hero2 =list(heros)  #heros[:]이런식으로 하는 것도 가능하다
hero2 += villans

print(heros)

#['superman', 'spiderman', 'batman']

list() 메서드를 이용해 새로운 객체를 생성해 주어 주소가 아닌 값으로 만들어 주는 방법

이것과 같은 방법으로 heros [:]을 사용하여 복사해 주는 방법도 있다.

2. copy.deepcopy() 메서드

from copy import *

heros = ["superman", "spiderman","batman"]
villans = ["joker", "Dr.Octopus"]

hero2 =deepcopy(heros)  #copy(heros)와 같음
hero2 += villans

print(heros)

#['superman', 'spiderman', 'batman']

이건 라이브러리의 copy를 이용하여 복사해 주는 방법이다.

위 같은 방식을 이용하면 얕은 복사가 아닌 깊은 복사가 가능하여 원본 리스트의 값을 유지한 채로 복사한 리스트의 값을 변경할 수 있다.

💡is 키워드

파이썬에서 보통 ==을 이용하여 변수들의 값이 같은지 비교한다.

이와 비슷하게 변수들의 주소값을 비교하는 키워드도 존재하는데 그게 'is'키워드이다.

heros = ["superman", "spiderman","batman"]
villans = ["joker", "Dr.Octopus"]

hero2 = heros
print(heros is hero2)

#True
heros = ["superman", "spiderman","batman"]
villans = ["joker", "Dr.Octopus"]

hero2 = list(heros)
print(heros is hero2)

#False

위를 보면 위처럼 얕은 복사를 했을 때True가 나오며, 깊은 복사를 했을 때 False가 출력됨을 알 수 있다.

이를 통해 해당 변수들이 같은 주소를 가리키는지 확인할 수 있다.

 


🔍리스트 함축(list comprehensions)

s = []

for i in range(10):
    num = i**2
    if num % 2 == 0:
        s.append(num)

print(s)
#[0, 4, 16, 36, 64]

위와 같이 for반복문과 if문으로 리스트를 생성할 때 이걸 함축하여 하나의 리스트 식으로 만들 수 있는데,

s = [x**2 for x in range(10) if (x**2) % 2 == 0]#[출력식 for i in oldlist if 조건식(선택)]
print(s)
#[0, 4, 16, 36, 64]

위와 같은 방식을 리스트 함축 방식이라 한다.

해당 방식은 수학적으로 집합을 정의하는 것과 유사하다.

 

한마디로 코드를 함축하는 것과 같다. 람다식과 같은 느낌.

from random import *

randList = [randint(1,100) for i in range(10)]

print(randList)
#[77, 73, 30, 14, 94, 24, 96, 61, 54, 91]

위같은 함수를 이용하는 방법 또한 가능하며

list1 = ["a","b","c","d","e","f"]
list2 = ["team " + str.upper(i) for i in list1]
print(list2)
#['team A', 'team B', 'team C', 'team D', 'team E', 'team F']

문자열도 가능하다.

heros = ["superman", "spiderman","batman", "ironman"]
villans = ["joker", "Dr.Octopus", "venom", "thanos"]

heroXVillan = [(x,y) for x in villans for y in heros]
print(heroXVillan)

#[('joker', 'superman'), ('joker', 'spiderman'), ('joker', 'batman'), 
#('joker', 'ironman'), ('Dr.Octopus', 'superman'), ('Dr.Octopus', 'spiderman'), 
#('Dr.Octopus', 'batman'), ('Dr.Octopus', 'ironman'), ('venom', 'superman'), 
#('venom', 'spiderman'), ('venom', 'batman'), ('venom', 'ironman'), ('thanos', 'superman'), 
#('thanos', 'spiderman'), ('thanos', 'batman'), ('thanos', 'ironman')]

위와 같은 방식으로 문자열 두 개를 카티션 곱으로 연결하기도 한다.

🔍파일 입출력

파이썬에서 파일을 입출력하는 것을 간단하게 소개하고자 한다.

from random import randint

data = []
fp = open("hi.txt", mode = "w", encoding="utf-8")
fp.write(str(list(randint(1, 100) for i in range (100))))
fp.close()
fp = open("hi.txt", mode = "r", encoding="utf-8")
print(fp.read())
fp.close()

open() 메서드를 이용하여 해당 파일의 경로를 입력하면 파일을 열 수 있으며,

mode에 w를 이용해 쓰기 r을 이용해 읽기를 설정할 수 있다.

write() 메서드로 해당 파일에 쓸 수도 있으며,

read() 메서드를 통해 읽어올 수 있다.

import csv

fp = open("data.csv",mode="r")
reader = csv.reader(fp)
for row in reader:
    print(row)

위처럼 파일을 읽고 쓰거나 csv파일을 읽어올 수도 있다.

from random import randint

data = []
fp = open("hi.txt", mode = "w", encoding="utf-8")
fp.write(str(list(randint(1, 100) for i in range (100))))
fp.close()
fp = open("hi.txt", mode = "r", encoding="utf-8")
print(fp.read())
fp.close()
import csv

fp = open("data.csv",mode="r")
reader = csv.reader(fp)
for row in reader:
    print(row)

위처럼 파일을 읽고 쓰거나 csv파일을 읽어올수도 있다.

 

'언어 > Python' 카테고리의 다른 글

10. 딕셔너리와 문자열  (4) 2025.08.28
9. 자료구조  (9) 2025.08.27
7. 리스트(list 자료형의 기능, 함수 등..)  (5) 2025.08.25
6. 함수2(Call-by-value,reference, 람다식, 튜플, 모듈 등...)  (6) 2025.08.25
5. 함수  (0) 2025.08.23