Oxygen Cherry - Pencil
본문 바로가기

새싹 데이터 분석 교육 (24.05.13~24.08.16)/TIL

LIST 자료형, for 반복문 - [파이썬 기초 4일차]

728x90

 

[프리코스] 파이썬 기초 특강 4일차 

❇️ 오늘 배운 내용 
1. LIST 인덱싱, 슬라이싱 
2. LIST 원소 삭제, 추가, 재할당, 존재 여부
3. 문자열 포매팅 
4. Tuple, Range 자료형 
5. for 반복문

 

 

 

주요 개념

 

Indexing [ ] type() .pop() f-string tuple
slicing  [0: :1] list() .append() string range

 

for 반복문 

리스트 컴프리핸션 

 

R -  sep() , n:n 수열

 

 

어제자 간단 복습 

 

1. 리스트 더하기, 곱하기 

2. if elif else 조건문 

 


리스트 인덱스 

 

강사님이 코드 트리 사이트 추천하심.  

 

 

💠 인덱싱 기본

 

[핵심]

  • 파이썬은 0부터 시작함. 첫번째 위치라고 1번이 아님! 
    number_list[0]
  • 끝에서 셀 때는 0이 아니라 -1임! (음수 인덱싱)
    number_list[-1]

 

#기본 원리
- 위치(index)를 사용해서 리스트 내부 원소(데이터)에 접근할 때 사용하는 개념. 
- 웬만한 언어에서 인덱싱을 []를 사용. 
- 리스트에 쓰는 []와 헷갈리지 말 것! 


#리스트 생성
1- 12345가 저장된 리스트를 생성하고
2- 변수에 할당 
(변수 만들고 리스트 생성하는 개념이 아님) 

number_list = [1, 2, 3, 4, 5]
데이터 - [1, 2, 3, 4, 5]
인덱스 -  0, 1, 2, 3, 4
역으로  -5, -4, -3, -2, -1 


#인덱싱 해보자 
- 리스트형 변수 [원소의 위치]
- 파이썬은 0부터 시작함. 첫번째 위치라고 1번이 아님! 

number_list[0]
-> 1가 나옴


print(number_list[2]) 
== 3


# 음수 인덱싱 (-1, -2...) 
- 뒤에서부터 찾는다. 
- 마지막 위치의 원소를 찾으려면 -1
- 끝에서 셀 때는 0이 아니라 -1임!


print(number_list[-1]) 
== 5

 

 

확인해볼 것 

  •  리스트형 변수 [원소의 위치]
    리스트형 변수만 해당인가? 인덱싱 아니지 않나 데이터프레임도 되는데 뭐는 안되고 뭐는 될까?
  • 파이썬은 0부터 시작함. 첫번째 위치라고 1번이 아님!
    r은 1부터 시작하지 않았던가? 

 

추가 설명

  • 왜 0부터 시작하나요 헷갈리게? 
    고대 컴퓨터(196-70)는 성능 구려가지고 0을 버리기에 아까웠다. 
    1부터 시작하면 0을 버리니까 쌉 아깝다. 

 

 

💠 슬라이싱 - 인덱싱 활용 

 

[핵심]

  • 슬라이싱
    • 리스트[시작위치: 마지막 위치: 간격] 
    • a~b의 것을 뽑고 싶으면 [a-1:b]하라. 

 

#슬라이싱 
- 리스트의 특정 구간을 분할 하는 것
- 리스트[시작위치: 마지막 위치: 간격] 


- 첫번째부터 세번째까지 분할하기 
slice1 = number_list[0:3]


#슬라이싱의 함정(마지막 위치) - 왜 첫번째~세번째가 0:2가 아닌가요? 
- 마지막 위치의 데이터가 포함되지 않기 때문. (고대 개발자들이 이케 만들어서.. 외워야..)
- 첫번째는 또 0부터 시작;; 

즉... 
a~b의 것을 뽑고 싶으면 
[a-1:b]하라 이거임. 
예를 들어 
[1:3]에서 [0:3]가 되는 거지. 


#간격 
- 간격 생략하면 1이 됨 

slice2 = number_list[0:4:2]
하면 1, 3, 5가 나옴.


#음수 인덱싱 슬라이싱 

slice3 = number_list[-3:-1:1]
-> 3, 4
-1이 마지막 원소인 5니까 그거 빼고 그 앞인 4까지 추출해준 거임. 



- 마지막 위치값을 생략한다면, 마지막 원소까지 다 뽑아줌.  
slice4 = number_list[-3::1]
-> 3, 4, 5

 

 

 

💠 원소 수정 

 

[핵심]

  • 데이터 수정
    • 삭제: number_list.pop(뺄 것의 위치) - 위치 생략 시 마지막에. 
      *** 즉시 변수에 할당하면 뺀 거를 따로 저장할 수 있다. 
    • 추가: number_list.append(넣을 원소) - 위치는 맨 마지막에. 
    • 수정: number_list[2] = 10 

 

#데이터 재할당 
- 특정 원소 바꽈주기 (인덱스로 뺀 값 마음에 안들 때) 

number_list[2] = 10 

print(number_list[2])
-> 원래 3이었는데 10 나옴


#리스트변수에 원소를 추가하고 싶을 때 
- 리스트형 변수.append(원소) 
- 제일 마지막에 넣어줌 

number_list.append(6)
string_list.append("h")


#리스트에 변수를 빼고 싶을 때 
- 리스트형 변수.pop(원소) 
- 제일 마지막 거를 삭제해줌. 

number_list.pop()

- 하지만 위치를 지정한다면? 

number_list.pop(3)

* 주의할 점 
pop으로 뭘 빼내면 순서가 밀림. 
즉 3번째 거 빼내면 뒤에거가 앞당겨지고 
1번째 거 빼내면 차례대로 앞당겨진단 거임. 


- 원소를 하나 빼내서 가져오려면? 
number = number_list.pop()
print(number)  
-> 5 뽑아줌 


즉 상자에 담긴 하나를 다른 작은 상자에 바꿔 담는 거임. 
바로 안담아주면 걍 내다버림.

 

 

 

추가 설명

  • pop()의 두 가지 특징
    • 삭제할 위치를 지정해서 없앨 수 있다. 
    • 리스트에서 삭제한 원소를 데이터로 되돌려준다. 
      (리스트에서 빼낸 걸 갖다준다는 거지..)

 

확인해볼 것 

  •  append(넣을 원소)에 넣을 위치 지정하는 인자 있겠지? 
    append(넣을 원소, 3) 뭐 이런 식으로 할라나? 

 

 

💠 원소 존재 여부 - in / not in  

#마켓이라는 리스트에 사과가 있느냐. 
"사과" in market 

#사과가 없느냐. 
"사과" not in market 

#결과는 true false로 나옴. 
그래서 조건문이랑 같이 잘 쓰임. 


---

market = ["우유", "달걀"] 


if "달걀" in market: 
  print("우유" * 6)
else:
	...

 

 

 

 

질의응답

 

  •  간격이 1이면 소수점일 때는 알잘딱하게 넘어가주나? 
    예를 들어서 [0.1, 0.33, 0.35, 1.12, 1.67, 4] 
    이러면은 0.1, 1.12, 4가 나옴?
    노노~ 숫자가 아니라 위치였던 거임! 
    걍 다 나오는 거임~ 
    띠요옹 나 왜 이거 헷갈린 거냐~! 
  • f스트링 쓰는 게 혹시 코드 성능에 도움이 되나요?
    짧은 거 쓸 때는 큰 차이를 못느끼겠읍니다...

    코드 실행 성능차이는 없지만 변수가 포함된 문자열을 생성할 때 효율적이라 활용합니다.
    특히, 복잡한 형태의 문자열 규칙을 지켜야할 때 활용하기에 좋습니다
    • 그래도 혹시 하나의 문자열만 쓰면 바이트 덜 차지하지 않을까? 그건 아닌가 흠 

 

number_list[2] = 10
print(number_list)

number_list[3] = 11
print(number_list)

했을 때

[1, 2, 10, 4, 5] ...①
[1, 2, 10, 11, 5]...②

이라고 출력되는데,
①이랑 ②랑 연관 없이 하려면 ([1, 2, 10, 4, 5] 인 리스트와 [1, 2, 3, 11, 5] 인 리스트를 만들려면)
그냥 매번 number_list를 새로 만들어서 입력해야하나요??

 

네... 리스트 복제해서.. 만드셔야 합니다.. 

 

 

문자열 리스트 실습 문제 
string_list = ["a", "b", "c", "d", "e", "f", "g"] 

#문제1. a b c만 뽑아라 

slice5 = string_list[:3]
[0:3:1] , [0:3]


#문제2. c d e f 뽑아라 

slice6 = string_list[2:-2]


or 

len(string_list) 
-> 음, 총 7개구나. 그럼 마지막 거는 위치가 6겠구나. 

slice6 = string_list[2:6]


#문제3. e f g 뽑아라 

slice7 = string_list[-3:]
[4:0]

#문제4. a c e 뽑아라 

slice8 = string_list[0:5:2]
[0:4:2] 아님;; 주의!!

 

 

 


문자열

 

 

💠문자열(그냥 "ㅇㅇㅇ" 이런 거)의 인덱스, 연산, 수정 

  1. 문자열 인덱싱, 연산 - 리스트와 동일 
    word = "abc"
    word[1] 하면 b 나오는... 
  2. 다만 문자열은 값의 재할당(수정), 추가, 삭제가 불가능하다. 
    list[0] = "d" 할 수 있는데 
    word[0] = "d" 해도 
    "dbc"가 되는 게 아니란 거지. 오류 뜸. 
  3. 추가처럼 보이게 더할 순 있다. 
    word.append(d)는 못하지만 
    word  = word + "d" 를 해서 "abcd"를 만들 순 있다. 

    겉은 같지만 원리가 다르다. 새로운 문자열인 d를 만들어서 더해준 것 뿐이라. 
    (그럼 이 방식은 코드 용량이나 바이트 사용값 같은 거 늘리나?) 

 

4. 문자열 분리해서 리스트로 저장 

<문자열을 리스트로 변환해서 각 원소로 분리하기>


word = "ab  cd" 

list(word)
-> 
['a', 'b', ' ', ' ', 'c', 'd']


- 공백도 나눠줌

 

 

 

 

💠f - string : 문자열 포매팅 

 

문자열 내부에 변수 또는 데이터를 삽입하는 방법. 

 

age = "28" 


print("내 나이는 28이야.")

이러면 나이 못바꾸잖아? 



# f-string 안쓴 방법 
 
print("내 나이는", age, "이야.")
 


# f-string 쓴 방법 
 
print(f"내 나이는 {age} 이야.")



#결론 

결과는 동일하지만 
아래 거 방법이 쉼표 덜 써도 되어서 간편하다. 
문자열 여러 개 안써도 된다. 문자열 내부에 변수를 삽입한 거라서.


---

# f-string 의 다른 예 

print(f"1 + 1 = {1+1}")

print(f"1 > 0 = {1>0}")
-> 이거 하면 True 나옴 

중괄호 안에 변수 말고 비교 연산자 등 표현식도 넣을 수 있음!

 

 

 

문자열 내부에 변수를 넣을 때가 생기면 

f-string 적극 활용하길! 

파이썬3인지 뭔지 최근에 생긴 좋은 기능이라고 함. 

 

 

 

 

확인해볼 것 

  • print(f"{a} + {b} = {a+b}")
    input(a) 
    input(b)
    이럴 수도 있겠네?! 

    근데 효율적일까... 

    -> 여쭤봐씀. 


  • class set은 어떤 자료형일까? 

 



그 외 자료형 

 

 

 

💠튜플(tuple) 자료형

#기본원리 
- 여러 종류의 자료형 같이 저장 가능 (=리스트)
- 수정(삭제, 추가, 재할당) 불가함 (=문자열)
- 즉 리스트와 문자열 속성을 섞은 것. 

- type: class 'tuple' 
- 생성은 소괄호 () 


#생성하자 

number_tuple = (1, 2, 3, 4)
type(number_tuple)


#패킹 문법 

number_tuple = 1, 2, 3, 4 

이래도 튜플로 인식되긴 함. 
패킹 어쩌고 하는 거 때문에 그러는데 기초는 아니니까 넘어가~

 

 

 

💠range 자료형 

연속된 정수 목록을 생성하는 것.

range(시작 숫자, 끝 숫자, 간격)

range(0, 6, 2)
-> [0, 2, 4]


시작, 간격 생략 가능. 
마지막은 절대 안됨, 어디까지 만들어야 될지 모르니까. 

슬라이싱은 마지막도 생략 가능. 
원래 정해진 리스트에서 뽑아주는 거니까.

 

 

range(0, 6) 하면 

0 1 2 3 4 5 

해서 총 6개인데 0~5까지 뽑아줌. 

range(1, 3) 하면 

1 2 

후덜덜  

 

이게 헷갈리는 게... 

여기서도 마지막 위치의 함정이 들어가서 

6을 안넣어줌... 

 

분명 어디서 가져오는 게 아니라 

정수로다가 목록을 만들어주는 걸텐데도! 

 

 

그럼 100에서 120까지 뽑으려면 

range(100, 121)해야 되는 거... 

 

a~b를 뽑으려면 

range(a, b+1) 해야 되는 거 ㄷㄷ 

 

 

 

+) R에서는 

 

seq(1,30)

1:30

30:1

 

sep 인수 - 시작숫자(from), 마지막 숫자(to), 간격(by), 갯수(length)

seq(from=1, by=2, length=5)

seq(1,10,2)

 

출처 

 

(r에서는 정수 수열 뽑는 진짜 간단한 방법 있다는 것만 생각하고 기억 안나서 찾아봄..ㅎ)

 

 

 


반복문

 

조건문이 개발의 꽃이라면 

반복문은 2인자 꽃이다. 

 

#기본 원리 
for 내부변수 variable in list: 
    결과(내부 변수) 

list 내부에 저장된 원소들이 내부 변수에 하나씩 할당되면서 결과에 있는 거를 반복 수행함. 


만약에 list 그냥 출력하면 [1, 2, ..] 이런 식으로 가진거 전부 나오겠지만 
for 반복문으로 단순하게 출력하면 
1
2
...
이런 식으로 하나씩 출력해주는 거임. 



#문제. 각 원소에 1을 더한 값을 출력 

list = [1, 2, 3, 4, 5] 

for i in list: 
   result = v+1
   print(result)

 

 

 

💠추가로 찾아본 FOR문 예시 

   
# 이런 비슷한 거 있지 않나? 나 뭐 만들었던 거 같은데 하 ㅠ 
for i in 1 
   i = i + 1 
 이거 안되는 이유가 어디까지 뽑을지를 안정해줘서...
 
 
 # 찾아옴 (점프 투 파이썬) 

add = 0 
for i in range(1, 11): 
... add = add + i 


print(add) 
55


# 즉 내가 알려고 하던 건 

for i in range(1, 11)
   i = i + 1 
   print(i)
   
   
# 살짝의 의문 - for문 안에서 프린트하는 것과 밖에서 하는 것의 차이 


1. for문 밖에서 출력 

add = 0 
for i in range(1, 11): 
... add = add + i 

print(add) 
55

-- 이러면 최종 add만 프린트해줄텐데 (1+3+6+10+15+...=55)


2. for문 안에서 출력 

add = 0 
for i in range(1, 11): 
... add = add + i 
... print(add) 


-- 이러면 하나씩 차례대로 
1
3
6
10
..
이케 나오나? 
그렇겠지 출력하고 다시 반복 수행하니까 


3. 리스트 컴프리핸션 
빈 리스트 만들어서 
거기에 저장하게 시키고 

for문 안에서 출력하면 
[1]
[1, 3]
[1, 3, 6] 
... 
이럴 것이고 

for문 밖에서 출력하면 
[1, 3, 6, ...] 이러겠지!

 

 

리스트 컴프리헨션 

>>> a = [1,2,3,4]
>>> result = []
>>> for num in a:
...     result.append(num*3)
...
>>> print(result)
[3, 6, 9, 12]

- 리스트.APPEND로 그냥.. 

 

위의 경우에선 

add = add + i  < 이걸 안넣으면 add가 갱신안되고 처음 지정한 값인 0에 머물러서 안됨. 

result.append(add)가 되겟네. 

 

 

 

다음 코드를 for문으로 작성하라.

print("-------")
print("-------")
print("-------")
print("-------")


답: 
for 변수 in [1, 2, 3, 4]:
  print("-------")
  
  
  
- 초보자를 위한 파이썬 300제

 

- 이거 *4로는 안되나? 

사실 "---" * 4를 출력하는 게 가장 간단하긴 할텐데 

반복문으로 만드는 방법은 아니니까...  

 

 

<다른 예시>

for number in range(len(marks)):
if marks[number] < 60:
continue 

- 점프투 파이썬

 

 

 


여담

 

 

1. 오늘 오프라인 등장 

 

오늘은 현장에 나왔다. 뭔가 피곤하다. 

한 3시? 4시? 쯤부터 3층 강의실에 있었다. 

그야 아침부터 나와서 여기저기 다녔으니까 그렇지. 

근데 왜이렇게 뭔가 한 게 없는 느낌이지? 

해결이 안되어서 그런가. 

 

내일은 노트북 두고 가는 김에 빨리 나와야겠다. 

 

 

 

2. 집중 파스스 

오늘 체력 안좋고 (어제 잠 덜 잠 + 오늘 아침부터 왔다갔다) 

밥 제대로 못묵었고 (땅콩샌드 1.n개 먹은 게 다) 

파이썬... 오늘치 배우는 량 너무 많아... 

 

 

3. 이거 배웠던 건데.. 기초인데.. 

f스트링 기억 못하고 있엇다.. 그외에도 

난... 바보야 

이런 기초를 하나하나 찾아서 외우고 반복해야 하는.. 그런.. 

나는 개발 바보 

개발은 역시 어려워 

개발자들 대단해!! 

728x90