[python] List 정리

ijnuyh·2025년 1월 25일

TIL

목록 보기
2/16

자료형에 대해 다시 톺아보기 위해 작성하는 오늘의 TIL

List

리스트의 선언

#1차원 리스트
>> 1_list = [item1, item2, ...]
#2차원 리스트
>> 2_list = [item1[item1_1, item1_2], item2[item2_1], ...]

비어있는 리스트
a = list() or []

넣을 수 있는 자료형 : 모든 자료형

list can do

더하기

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b
[1, 2, 3, 4, 5, 6]

반복

>>> a = [1, 2, 3]
>>> a * 2
[1, 2, 3, 1, 2, 3]

len(list)

>>> a = [1, 2, 3]
>>> len(a)
3

수정

>>> a = [1, 2, 3]
>>> a[1] = 4
>>> print(a) 
[1, 4, 3]

삭제

>>> a = [1, 2, 3]
>>> del a[1]
>>> a
[1, 3]

제거
가장 처음 요소가 삭제됨.

>>> a = ['a', 'b', 'c', 'b']
>>> a.remove(b)
>>> a
['a', 'c', 'b']

pop
맨 뒤의 요소만 삭제됨.

>>> a = ['a', 'b', 'c']
>>> a.pop()
>>> a
['a', 'b']

추가

>>> a = [1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> a.append([5,6])
>>> a
[1, 2, 3, 4, [5, 6]]

삽입

>>> a = ['a', 'b', 'c']
>>> a.insert(0,'x') #0번째 위치에 x를 삽입
>>> a
['x', 'a', 'b', 'c']

정렬

>>> a = [1, 4, 3, 2]
>>> a.sort()
>>> a
[1, 2, 3, 4]

뒤집기
주의점 : 역정렬이 아니라 그냥 그대로 반대로 뒤집는 것

>>> a = ['a', 'c', 'b']
>>> a.reverse()
>>> a
['b', 'c', 'a']

카운팅
괄호 속의 요소가 몇개 있는지 카운팅하여 리턴

>>> a = [1, 2, 3, 4, 1]
>>> a.count(1)
2

확장
extend(x)의 x는 리스트만 가능. x리스트를 더하는 것이다.
a.extend([5,6]) / b+= [5,6] 이 둘은 같은 말이다.

>>> a = [1, 2, 3, 4]
>>> a.extend([5,6]) 
>>> a
[1, 2, 3, 4, 5, 6]

>>> b = [1, 2, 3, 4]
>>> b+= [5,6]
>>> b
[1, 2, 3, 4, 5, 6]

리스트 간 빼기

리스트 간 빼는건, 불가. a - b 가 불가하다는 말.
그럼 어떻게 써야할까?

a = [1,2,3]
b = [1,2]

[x for x in a if x not in b] # [3]

list(set(a) - set(b)) # [3]

list(set(a).difference(b)) # [3]

2차원 리스트 입력

백준에서 사용하는 알고리즘에서 2차원 리스트를 입력을 받을 때 사용하는 형식

arr = []
for i in range(x):
	arr[i] = list(map(int, input().split()))

⭐️ 요소 접근 ⭐️

리스트[행 idx][열 idx] = 리스트[세로인덱스][가로인덱스] = 값

>>> a = [[10, 20], [30, 40], [50, 60]]
>>> a[2][1]           #2행 1열
60
>>> a[0][1] = 1000    # 0행, 1열인 요소에 값 할당
>>> a[0][1]
1000

>>> a
[[10, 1000], [30, 40], [50, 60]]

리스트 컴프리헨션 사용

first_indices = [row[0] for row in info]  # 각 리스트의 0번 인덱스 값만 가져옴

#조건 추가
filtered_values = [row[0] for row in info if row[0] == 1]  # 0번 인덱스 값이 1인 것만

특정 인덱스의 값이 x인 리스트의 다른 인덱스값

  1. 리스트 컴프리헨션 사용

result = [row[1] for row in info if row[0] == 1]
  1. for loop

for row in info:
    if row[0] == 1:  # 0번 인덱스가 1인지 확인
        result.append(row[1])  # 1번 인덱스 값을 추가

번외
if, 첫번째 인덱스만 필요하다면?

result = next((row[1] for row in info if row[0] == 1), None)
print(result)  # 출력: 1 
#첫 번째로 조건을 만족하는 1번 인덱스 값

⭐️ 요소 검증 ⭐️

task
2차원 리스트의 모든 요소를 순회하며 num이 있는지 확인.

(1) if num in ~

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

# 10이 배열 내에 존재하는지 check
num = 10

if num in (x_num for row in matrix for x_num in row):
    print("10은 배열 내에 있습니다.")
else:
    print("10은 배열 내에 없습니다.")
  1. if num in -> 만약, num 이 있다면,

  2. x_num -> 비교할 임의의 변수에 계속 할당되는 숫자

  3. for row in matrix -> 2차원 리스트인 matrix의 안의 리스트가 순차적으로 row에 할당.

  4. for x_num in row -> 3에서의 할당된 row 리스트에서 요소를 하나씩 꺼내 x_num에 할당. 해당 x_num으로 num과 비교하며 찾음.

(2) any ~

any(iter) : iter의 요소 중 하나라도 True일 경우, True를 반환.
단 하나의 참만 있어도 즉시 종료

any는 조건이 참인 경우, 한번 True를 만족하면 순회 끝.

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

found = any(num == x_num for row in matrix for x_num in row)

if found:
    print("10은 배열 내에 있습니다.")
else:
    print("10은 배열 내에 없습니다.")
  1. for row in matrix
    matrix의 각 행(즉, 리스트의 리스트)을 하나씩 가져옴.
    첫 번째 row: [1, 2, 3]
    두 번째 row: [4, 5, 6]
    세 번째 row: [7, 8, 9, 10]

  2. for x_num in row
    현재 row에 포함된 요소를 하나씩 가져옴.
    첫 번째 row) x_num = 1, 2, 3
    두 번째 row) x_num = 4, 5, 6
    세 번째 row) x_num = 7, 8, 9, 10

  3. num == x_num
    가져온 x_num 값과 num(10)을 비교.

첫 번째 row ) 1 == 10, 2 == 10, 3 == 10 모두 거짓.
세 번째 row에서 10 == 10이 참.

  1. any()
    위의 조건이 참(True)인 순간, any()가 즉시 True를 반환.
    num == x_num이 단 한 번이라도 참이라면, 더 이상 순회하지 않고 결과 반환.

  2. 변수 found
    found : any()의 반환값 저장.

무슨 검증 방법을 쓸까?

1)

  • 특정 값의 존재 여부를 간단히 확인.
  • 데이터 구조가 복잡하지 않고, 조건 없이 특정 값이 있는지만 확인할 때.
  • 리스트의 값이 중복될 수 있는 경우.

2)

  • 복잡한 조건일 때 (다양한 조건 조합 가능)
found = any(x % 2 == 0 for row in matrix for x in row)
  • 조건을 함수형태로 표현하는 스타일을 선호할 때.
  • 데이터 구조가 복잡할 때. (한번의 True값만 나오는지 확인하면 되므로.)
profile
ad astra per aspera

0개의 댓글