텍스트 파일 불러오기와 리스트 활용

์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋ฐ์ดํ„ฐ ์–‘์ด ๋งŽ์•„์ง€๋ฉด ํŒŒ์ผ์— ์ €์žฅํ•œ ํ›„์— ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์žฌํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ๊ฐœ๋ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋”ฐ๋กœ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋กœ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋งŽ์€ ๋ฐ์ด์ฒ˜๋ฅผ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋กœ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‹ค์–‘ํ•œ ์ž๋ฃŒํ˜•์ด ์ œ๊ณต๋˜๋ฉฐ ์—ฌ๊ธฐ์„œ๋Š” ํŒŒ์ด์ฌ์˜ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์˜ ํ™œ์šฉ์„ ์•Œ์•„๋ณธ๋‹ค.

주요 내용

ํ…์ŠคํŠธ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ฝ์–ด๋“œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•๊ณผ ํŒŒ์ด์ฌ์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ์ปฌ๋ ‰์…˜ ์ž๋ฃŒํ˜• ์ค‘์˜ ํ•˜๋‚˜์ธ ๋ฆฌ์ŠคํŠธ(list)๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

๋ฆฌ์ŠคํŠธ(lists): ํŒŒ์ด์ฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž„์˜์˜ ๊ฐ’๋“ค์„ ๋ชจ์•„์„œ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ์ž๋ฃŒํ˜•

  • ์‚ฌ์šฉ ํ˜•ํƒœ: ๋Œ€๊ด„ํ˜ธ ์‚ฌ์šฉ

    even_numbers_list = [2, 4, 6, 8, 10]
    todays_datatypes_list = ['list', 'tuple', 'dictionary']
  • ํŠน์ง•: ์ž„์˜์˜ ์ž๋ฃŒํ˜• ๊ฐ’๋“ค์„ ์„ž์–ด์„œ ํ•ญ๋ชฉ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    mixed_list = [1, 'abs', [2.1, 4.5]]
  • ์ธ๋ฑ์Šค ๋˜๋Š” ์Šฌ๋ผ์ด์‹ฑ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ๊ฐ์˜ ํ•ญ๋ชฉ์— ๋˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•์€ ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ์™€ ๋™์ผ.

  • ๋ฆฌ์ŠคํŠธ๋Š” ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰, ๊ฐ€๋ณ€ ์ž๋ฃŒํ˜•์ด๋‹ค.

  • ๋ฆฌ์ŠคํŠธ์™€ ๊ด€๋ จ๋˜์–ด ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    • append(): ๊ธฐ์กด์˜ ๋ฆฌ์ŠคํŠธ ๋์— ํ•ญ๋ชฉ ์ถ”๊ฐ€
    • extend(): ๋‘ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ ์ด์–ด๋ถ™์ด๊ธฐ
    • insert(): ๊ธฐ์กด์˜ ๋ฆฌ์ŠคํŠธ ์ค‘๊ฐ„์— ํ•ญ๋ชฉ ์‚ฝ์ž…
    • pop(), remove(), del: ํ•ญ๋ชฉ ์‚ญ์ œ
    • count(): ๋ฆฌ์ŠคํŠธ์— ํฌํ•จ๋œ ํŠน์ • ํ•ญ๋ชฉ์ด ๋ช‡ ๋ฒˆ ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ์„ธ์–ด ์คŒ.
    • index(): ํŠน์ • ํ•ญ๋ชฉ์˜ ์ธ๋ฑ์Šค๊ฐ€ ๋ช‡ ๋ฒˆ์ธ์ง€ ํ™•์ธํ•ด ์คŒ.

오늘의 주요 예제

data ๋””๋ ‰ํ† ๋ฆฌ์— ์œ„์น˜ํ•œ scores_list.txt ํŒŒ์ผ์€ ์„ ์ˆ˜ ์—ฌ๋Ÿ ๋ช…์˜ ์ ์ˆ˜๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.

txt
Name    Score
player1 21.09 
player2 20.32 
player3 21.81 
player4 22.97 
player5 23.29 
player6 22.09 
player7 21.20 
player8 22.16

๋ชฉํ‘œ: ์œ„ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ 1~3๋“ฑ ์„ ์ˆ˜์˜ ์ ์ˆ˜๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ํ™•์ธํ•˜๊ธฐ

txt
1๋“ฑ 23.29 
2๋“ฑ 22.97 
3๋“ฑ 22.16

์ฐธ์กฐ: Head First Programming(ํ•œ๋น›๋ฏธ๋””์–ด) 4์žฅ

준비 사항

  • ํŒŒ์ผ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ฑฐ๋‚˜ ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

  • ๋ฆฌ์ŠคํŠธ์˜ ์ •์˜์™€ ๊ธฐ์ดˆ์ ์ธ ํ™œ์šฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

파일에 저장된 데이터 불러오기

์ฆ‰, ์ฒซ์งธ ์ค„์€ ์„ ์ˆ˜์ด๋ฆ„(Name)๊ณผ ์ ์ˆ˜(Score)์˜ ํ•ญ๋ชฉ์ด ํ‘œ์‹œ๋˜์–ด ์žˆ์œผ๋ฉฐ ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ ์„ ์ˆ˜์ด๋ฆ„๊ณผ ์ ์ˆ˜๊ฐ€ ์ž‘์„ฑ๋˜์–ด ์žˆ๋‹ค.

์œ„ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ํŒŒ์ด์ฌ ์ฝ”๋“œ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

In [1]:
result_f = open("data/scores_list.txt")   # ํŒŒ์ผ ์—ด๊ธฐ

for line in result_f:                                  # ๊ฐ ์ค„ ๋‚ด์šฉ ์ถœ๋ ฅํ•˜๊ธฐ
    print(line)

result_f.close()                                       # ํŒŒ์ผ ๋‹ซ๊ธฐ
Name    Score

player1 21.09

player2 20.32

player3 21.81

player4 22.97

player5 23.29

player6 22.09

player7 21.20

player8 22.16

주의사항

์ค„ ์‚ฌ์ด์— ์ƒˆ๋กœ์šด ์ค„์ด ํฌํ•จ๋œ ์ด์œ ๋Š” ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋ฉด์„œ ์ค„๋ฐ”๊พธ๊ธฐ๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์—”ํ„ฐ์— ์˜ํ•ด ์ค„๋ฐ”๊พธ๊ธฐ ๊ธฐํ˜ธ(\n)๊ฐ€ ๊ฐ ์ค„์˜ ๋งจ ๋์— ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ค„๋ฐ”๊พธ๊ธฐ๋ฅผ ํ•œ ๋ฒˆ ๋” ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ strip ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

In [2]:
result_f = open("data/scores_list.txt")

for line in result_f: 
    print(line.strip())              # strip ๋ฉ”์†Œ๋“œ ํ™œ์šฉํ•˜๊ธฐ

result_f.close() 
Name    Score
player1 21.09
player2 20.32
player3 21.81
player4 22.97
player5 23.29
player6 22.09
player7 21.20
player8 22.16

주의사항

  • strip ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‹ค ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ๋ฒ„๋ฆ‡์ด๋‹ค.
  • ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ฒฝ์šฐ์— ๋”ฐ๋ผ strip ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

์ด์ œ 1๋“ฑ ์ ์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ณ ์ž ํ•œ๋‹ค. ์ด๋•Œ ์ด์ „์— ๋ฐฐ์šด ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•ด๋ณด์ž.

예제

์•„๋ž˜ ์˜ˆ์ œ๋Š” ์—†๋Š” ํŒŒ์ผ์„ open ํ•จ์ˆ˜๋กœ ์—ด๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

๋จผ์ € ์—†๋Š” ํŒŒ์ผ์„ ์—ด๋ ค๊ณ  ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•จ์„ ํ™•์ธํ•˜์ž.

In [3]:
file = open('data/no_file.txt')
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-3-b7955c7e557c> in <module>()
----> 1 file = open('data/no_file.txt')

FileNotFoundError: [Errno 2] No such file or directory: 'data/no_file.txt'

์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์—ด๊ณ ์ž ํ•˜๋Š” ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ๋‹จ์ˆœํžˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ ์‹คํ–‰์ด ๋ฉˆ์ถ”๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์œ ์ตํ•˜๋‹ค.

In [4]:
try:
    file = open('data/no_file.txt')
except:
    print("์—ด๊ณ ์ž ํ•˜๋Š” ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.")
์—ด๊ณ ์ž ํ•˜๋Š” ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

1, 2, 3등 점수 확인하기

1등 점수 확인하기

์•ž์„œ ํŒŒ์ผ ๋‚ด์šฉ์„ ํ™•์ธํ•ด ๋ณด์•˜๋“ฏ ๊ฐ ์ค„๋งˆ๋‹ค ์„ ์ˆ˜์ด๋ฆ„๊ณผ ์ ์ˆ˜๊ฐ€ ๊ณต๋ฐฑ์„ ์‚ฌ์ด๋กœ ๋‘๊ณ  ๊ฐ ์ค„์— ์ ํ˜€ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์ด split ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ ์ค„์„ ์ชผ๊ฐœ์–ด ๋‘ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

주의사항

split ๋ฉ”์†Œ๋“œ์˜ ๊ธฐ๋Šฅ์„ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Name Score๋ผ๋Š” ๋ฌธ์ž์—ด์„ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ์ชผ๊ฐœ๋ฉด ๊ธธ์ด๊ฐ€ ๋‘ ๊ฐœ์˜ ๋‹จ์–ด๋กœ ๊ตฌ์„ฑ๋œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

In [5]:
'Name   Score'.split()
Out[5]:
['Name', 'Score']

ํŒŒ์ผ์˜ ๊ฐ ์ค„์ด ๋™์ผํ•œ ๋ชจ์–‘์„ ๊ฐ–๊ณ  ์žˆ๋‹ค๋Š” ์ ์— ์ฐฉ์•ˆํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ์ค„์˜ ๋‚ด์šฉ ์ค‘์—์„œ ์ ์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์„ ์•„๋ž˜์™€ ๊ฐ™์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜: ๋ฆฌ์ŠคํŠธ์˜ ์ƒ‰์ธ๋„ ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฆฌ์ŠคํŠธ์˜ ๋‘˜์งธ ํ•ญ๋ชฉ์˜ ์ƒ‰์ธ์€ 1์ธ๋‹ค.

In [6]:
result_f = open("data/scores_list.txt")

for line in result_f: 
    record = line.split()
    print(record[1])

result_f.close() 
Score
21.09
20.32
21.81
22.97
23.29
22.09
21.20
22.16

๊ทธ๋Ÿฐ๋ฐ ์ฒซ์งธ ์ค„ ๋‚ด์šฉ์€ ์ ์ˆ˜๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฐ์— ํ•„์š”์—†๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌด์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.

ํŠน์ • ์ค„์„ ๋ฌด์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ธฐ์ˆ ์ด ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” try ... except ... ๋ช…๋ น๋ฌธ์„ ์ด์šฉํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•œ๋‹ค.

์ฃผ์˜: ์—ฌ๊ธฐ์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๊ธฐ์ˆ ์„ ์ด์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • split ๋ฉ”์†Œ๋“œ๋กœ ์ชผ๊ฐœ์ง„ ๊ฐ’๋“ค์€ ๋ชจ๋‘ ๋ฌธ์ž์—ด๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.
  • ํ•˜์ง€๋งŒ ์ ์ˆ˜๋ฅผ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ถ€๋™์†Œ์ˆ˜์ ์œผ๋กœ ํ˜•๋ณ€ํ™˜ ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ ์ฒซ์งธ ์ค„์— float ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰์„ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ผ์„ ํ•˜๋„๋ก ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • ์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” float ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฌด์‹œํ•˜๊ณ  ๋‹ค์Œ ์ค„๋กœ ๋„˜์–ด๊ฐ€๋Š” ์‹์œผ๋กœ ์˜ค๋ฅ˜์ฒ˜๋ฆฌ๋ฅผ ํ•˜์˜€๋‹ค.
In [7]:
result_f = open("data/scores_list.txt")

highest_score = 0                   # 1๋“ฑ ์ ์ˆ˜ ์ €์žฅ

for line in result_f: 
    record = line.split()

    try:                           # ์ฒซ์ค„ ์ œ์™ธ ์šฉ๋„
        score = float(record[1])
    except:
        continue

    if highest_score < score:       # 1๋“ฑ ์ ์ˆ˜ ๊ฐฑ์‹  ๊ฒฝ์šฐ ํ™•์ธ
        highest_score = score
    else:
        continue

result_f.close() 

print("1๋“ฑ ์ ์ˆ˜๋Š”", highest_score, "์ž…๋‹ˆ๋‹ค.")
1๋“ฑ ์ ์ˆ˜๋Š” 23.29 ์ž…๋‹ˆ๋‹ค.

2등 점수 확인하기

2๋“ฑ ์ ์ˆ˜๊นŒ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด 2๋“ฑ ์ ์ˆ˜๋ฅผ ๊ธฐ์–ตํ•  ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜ ๋” ํ•„์š”ํ•˜๋ฉฐ ํ™•์ธ๋œ ์ ์ˆ˜๊ฐ€ ๊ธฐ์กด์˜ 1๋“ฑ ์ ์ˆ˜๋ณด๋‹ค ํฐ์ง€, 2๋“ฑ ์ ์ˆ˜๋ณด๋‹ค ํฐ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ 1, 2๋“ฑ ์ ์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’๋“ค์„ ์—…๋ฐ์ดํŠธ ํ•ด์•ผ ํ•œ๋‹ค.

In [8]:
result_f = open("data/scores_list.txt")

highest_score = 0
second_highest_score = 0                    # 2๋“ฑ ์ ์ˆ˜ ์ €์žฅ

for line in result_f: 
    record = line.split()

    try: 
        score = float(record[1])
    except:
        continue

    if highest_score < score:               # 1, 2๋“ฑ ์ ์ˆ˜ ๊ฐฑ์‹  ๊ฒฝ์šฐ ํ™•์ธ
        second_highest_score = highest_score
        highest_score = score
    elif second_highest_score < score:      # 2๋“ฑ ์ ์ˆ˜ ๊ฐฑ์‹  ๊ฒฝ์šฐ ํ™•์ธ
        second_highest_score = score
    else:
        continue

result_f.close() 

print("1๋“ฑ ์ ์ˆ˜๋Š”", highest_score, "์ž…๋‹ˆ๋‹ค.")
print("2๋“ฑ ์ ์ˆ˜๋Š”", second_highest_score, "์ž…๋‹ˆ๋‹ค.")
1๋“ฑ ์ ์ˆ˜๋Š” 23.29 ์ž…๋‹ˆ๋‹ค.
2๋“ฑ ์ ์ˆ˜๋Š” 22.97 ์ž…๋‹ˆ๋‹ค.

3등 점수 확인하기

์ด์ œ 3๋“ฑ ์ ์ˆ˜๊นŒ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์ฝ”๋“œ๋ฅผ ๋” ๋งŽ์ด ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋ฉฐ, ๋” ๋งŽ์€ ๋ณ€์ˆ˜์™€ ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

In [9]:
result_f = open("data/scores_list.txt")

highest_score = 0
second_highest_score = 0
third_highest_score = 0                          # 3๋“ฑ ์ ์ˆ˜ ์ €์žฅ

for line in result_f: 
    record = line.split()

    try: 
        score = float(record[1])
    except:
        continue

    if highest_score < score:                     # 1, 2, 3๋“ฑ ์ ์ˆ˜ ๊ฐฑ์‹  ํ™•์ธ
        third_highest_score = second_highest_score
        second_highest_score = highest_score
        highest_score = score
    elif second_highest_score < score:            # 2, 3๋“ฑ ์ ์ˆ˜ ๊ฐฑ์‹  ํ™•์ธ
        third_highest_score = second_highest_score
        second_highest_score = score
    elif third_highest_score < score:             # 3๋“ฑ ์ ์ˆ˜ ๊ฐฑ์‹  ํ™•์ธ
        third_highest_score = score        
    else:
        continue

result_f.close() 

print("1๋“ฑ ์ ์ˆ˜๋Š”", highest_score, "์ž…๋‹ˆ๋‹ค.")
print("2๋“ฑ ์ ์ˆ˜๋Š”", second_highest_score, "์ž…๋‹ˆ๋‹ค.")
print("3๋“ฑ ์ ์ˆ˜๋Š”", third_highest_score, "์ž…๋‹ˆ๋‹ค.")
1๋“ฑ ์ ์ˆ˜๋Š” 23.29 ์ž…๋‹ˆ๋‹ค.
2๋“ฑ ์ ์ˆ˜๋Š” 22.97 ์ž…๋‹ˆ๋‹ค.
3๋“ฑ ์ ์ˆ˜๋Š” 22.16 ์ž…๋‹ˆ๋‹ค.

나쁜 프로그래밍

์•ž์„œ 1๋“ฑ๊นŒ์ง€, 2๋“ฑ๊นŒ์ง€, 3๋“ฑ๊นŒ์ง€ ์ ์ˆ˜๋ฅผ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๋Š” ๊ฐ์ž ๋‹ค๋ฅด๋ฉฐ, ์ ์ฒ˜ ๊ธธ์–ด์ง€๊ณ  ๋ณต์žกํ•ด์กŒ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

๋ฌด์—‡๋ณด๋‹ค๋„ ์›ํ•˜๋Š” ๋“ฑ์ˆ˜์— ๋”ฐ๋ผ ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์ˆ˜์ •๋˜์–ด์•ผ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋ฉด ์ ˆ๋Œ€ ์•ˆ๋œ๋‹ค. ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

์•ž์„  ์ฝ”๋“œ์˜ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ์ ์€ ๊ฐ ์„ ์ˆ˜์˜ ์ ์ˆ˜๋ฅผ ๋”ฐ๋ผ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์„ ์ˆ˜์˜ ์ ์ˆ˜๋ฅผ ๋ชจ์•„์„œ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ ์ด ์š”๊ตฌ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์„ ํ™œ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๋“ฑ์ˆ˜์™€ ์„ ์ˆ˜์˜ ์ˆ˜์— ์ƒ๊ด€์—†์ด ๋™์ผํ•œ ์ฝ”๋“œ๋กœ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•œ๋‹ค.

리스트 활용

๋ช‡ ๋“ฑ ์ ์ˆ˜๋ฅผ ์•Œ์•„๋‚ด์•ผ ํ•˜๋Š”๊ฐ€์™€ ์ƒ๊ด€์—†์ด ๋ชจ๋“  ์งˆ๋ฌธ์— ๋‹ต์„ ํ•˜๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•˜๋ฉฐ, ์•„์ด๋””์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์„œํ•‘ ๋Œ€ํšŒ ์ฐธ๊ฐ€์„ ์ˆ˜๋“ค์˜ ์ ์ˆ˜๋งŒ์„ ๋”ฐ๋กœ ๋ชจ์•„ ๋†“์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ๋ฆฌ์ŠคํŠธ์˜ ํ•ญ๋ชฉ๋“ค์„ ์ˆซ์žํฌ๊ธฐ ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌ(sorting)ํ•œ๋‹ค.
  • ์—ญ์ˆœ, ์ฆ‰ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ์˜ ์ƒ‰์ธ์„ ์ด์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๋“ฑ์ˆ˜์˜ ์ ์ˆ˜๋ฅผ ํ™•์ธํ•œ๋‹ค.

기본 아이디어

์งˆ๋ฌธ: ๊ทธ๋ ‡๋‹ค๋ฉด ์ ์ˆ˜๋งŒ ๋ฝ‘์•„์„œ ๋ชจ์€ ๋‹ค์Œ์— ์ ์ˆ˜๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ์ข‹์ง€ ์•Š์„๊นŒ?

๋‹ต: ๋งค์šฐ ๊ทธ๋ ‡๋‹ค.

๋ฐฉ๋ฒ•: split(), append() ๋ฉ”์†Œ๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด for ๋ฌธ๊ณผ ํ•จ๊ป˜ ํ™œ์šฉํ•˜๋ฉด ๋จ.

In [10]:
result_f = open("data/scores_list.txt")

score_list = []                         # ์ ์ˆ˜ ์ €์žฅ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ

for line in result_f: 
    (name, score) = line.split()        # ๊ฐ ์ค„์„ ๋‘ ๋‹จ์–ด์˜ ๋ฆฌ์ŠคํŠธ๋กœ ์ชผ๊ฐœ๊ธฐ
    try:
        score_list.append(float(score)) # ์ฒซ์งธ ์ค„ ์ œ์™ธ. ์ˆซ์ž๋งŒ scores ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€
    except:
        continue

result_f.close() 

score_list.sort()                       # ๋ฆฌ์ŠคํŠธ๋ฅผ ํฌ๊ธฐ์ˆœ์œผ๋กœ ์ •๋ ฌ(์˜ค๋ฆ„์ฐจ์ˆœ)
score_list.reverse()                    # ๋ฆฌ์ŠคํŠธ์˜ ํ•ญ๋ชฉ๋“ค์˜ ์ˆœ์„œ ๋’ค์ง‘๊ธฐ

print("The top scores were:") 
print(score_list[0])                    # 0๋ฒˆ ์ƒ‰์ธ๊ฐ’ = 1๋“ฑ ์ ์ˆ˜
print(score_list[1])                    # 1๋ฒˆ ์ƒ‰์ธ๊ฐ’ = 2๋“ฑ ์ ์ˆ˜
print(score_list[2])                    # 2๋ฒˆ ์ƒ‰์ธ๊ฐ’ = 3๋“ฑ ์ ์ˆ˜
The top scores were:
23.29
22.97
22.16

주의사항

์œ„ ์ฝ”๋“œ์˜ 4๋ฒˆ ์ค„์— ์‚ฌ์šฉ๋œ line.split()์ด ์„ ์ˆ˜์ด๋ฆ„๊ณผ ์ ์ˆ˜๋ฅผ ์ชผ๊ฐœ๋Š” ๊ณผ์ •์ด๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ๋Š” ์œ„ ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ์„ธ๋ จ๋˜๊ฒŒ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์˜ 4๋ฒˆ ์ค„ ๋‚ด์šฉ์€ split() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์„ ์ˆ˜ ์ด๋ฆ„๊ณผ ์ ์ˆ˜๋กœ ์ชผ๊ฐœ์ง„ ๊ฐ๊ฐ์˜ ๊ฐ’์„ ๊ฐ–๋Š” ๋ณ€์ˆ˜๋ฅผ ๋™์‹œ์— ์„ ์–ธํ•˜๊ณ  ์žˆ๋‹ค. (์ฃผ์˜: split()์˜ ๊ฒฐ๊ณผ๋กœ ๊ธธ์ด๊ฐ€ 2์ธ ๋ฆฌ์ŠคํŠธ๋ฅผ ์–ป๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ฏธ๋ฆฌ ์˜ˆ์ƒํ•˜์˜€์Œ์— ์ฃผ์˜ํ•˜๋ผ.)

(name, score) = line.split()

์œ„์™€ ๊ฐ™์ด ํ•˜๋ฉด ๋‹ค์Œ ์ฒ˜๋Ÿผ ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ผ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

name = line.split()[0]
score = line.split()[1]

주의사항

์•„๋ž˜ ๋‘ ์ค„์˜ ์ฝ”๋“œ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

score_list.sort()
score_list.reverse()

์œ„ ๋‘ ์ค„์˜ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•œ ์ค„๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

score_list.sort(reverse=True)
In [11]:
result_f = open("data/scores_list.txt")

score_list = []                        

for line in result_f: 
    (name, score) = line.split()       
    try:
        score_list.append(float(score))
    except:
        continue

result_f.close() 

score_list.sort(reverse=True)           # ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ

print("The top scores were:") 
print(score_list[0])   
print(score_list[1])   
print(score_list[2])   
The top scores were:
23.29
22.97
22.16

함수 활용

์•ž์„œ ์‚ดํŽด๋ณธ ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜๋กœ ์ถ”์ƒํ™”ํ•˜๋ฉด ์›ํ•˜๋Š” ๋“ฑ์ˆ˜์˜ ์ ์ˆ˜๋ฅผ ํ•จ์ˆ˜ํ˜ธ์ถœ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜: ํ•จ์ˆ˜์˜ ์ •์˜ํ™” ๊ธฐ์ดˆ์ ์ธ ํ™œ์šฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

In [12]:
def ranking(rank):                        # ์›ํ•˜๋Š” ๋“ฑ์ˆ˜๋ฅผ ์ธ์ž๋กœ ์‚ฌ์šฉ
    result_f = open("data/scores_list.txt")

    score_list = [] 

    for line in result_f: 
        (name, score) = line.split() 
        try:
            score_list.append(float(score)) 
        except:
            continue
    result_f.close() 

    score_list.sort(reverse=True) 
    
    return score_list[rank-1]               # ์›ํ•˜๋Š” ๋“ฑ์ˆ˜์˜ ์ ์ˆ˜ ๋ฆฌํ„ด

์ด์ œ 1, 2, 3๋“ฑ ์ ์ˆ˜๋ฅผ ๊ฐ€๋ณ๊ฒŒ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

In [13]:
print(ranking(1), ranking(2), ranking(3))
23.29 22.97 22.16

연습문제

연습

๋นˆ ๋ฆฌ์ŠคํŠธ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
In [14]:
empty_list = []

๋นˆ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๋Š” 0์ด๋‹ค.

In [15]:
len(empty_list)
Out[15]:
0

๋นˆ ๋ฆฌ์ŠคํŠธ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ 0๋ฒˆ ์ธ๋ฑ์Šค ๊ฐ’๋„ ์—†๋‹ค.

In [16]:
empty_list[0]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-16-29438dbc2832> in <module>()
----> 1 empty_list[0]

IndexError: list index out of range

주의

๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

In [17]:
empty_list = list()

๋ฐ˜๋ฉด์— ์•„๋ž˜ ๋ฆฌ์ŠคํŠธ๋Š” ๋นˆ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋‹ค.

In [18]:
a_singleton = [[]]

์œ„ ๋ฆฌ์ŠคํŠธ๋Š” ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ํฌํ•จํ•œ ๋ฆฌ์ŠคํŠธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ธธ์ด๊ฐ€ 1์ด๋‹ค.

In [19]:
len(a_singleton)
Out[19]:
1

ํฌํ•จ๋œ ์œ ์ผํ•œ ํ•ญ๋ชฉ์€ ๋นˆ ๋ฆฌ์ŠคํŠธ์ด๋‹ค.

In [20]:
a_singleton[0]
Out[20]:
[]

연습

๋ฆฌ์ŠคํŠธ๋Š” ์ค‘์ฒฉ์„ ํ—ˆ์šฉํ•œ๋‹ค. ์•„๋ž˜ ๋ฆฌ์ŠคํŠธ๋Š” 3์ค‘ ๋ฆฌ์ŠคํŠธ์ด๋‹ค.

In [21]:
a_nested_list = [1, 2, [3, 4], [[5, 6, 7], 8]]
  • ์ฒซ์งธ, ๋‘˜์งธ ํ•ญ๋ชฉ์€ ์ •์ˆ˜์ธ 1๊ณผ 2์ด๋‹ค.
  • ์…‹์ฉจ ํ•ญ๋ชฉ์€ 3๊ณผ 4๋กœ ์ด๋ฃจ์–ด์ง„ ๊ธธ์ด๊ฐ€ 2์ธ ๋ฆฌ์ŠคํŠธ [3, 4]์ด๋‹ค.
  • ๋„ท์งธ ํ•ญ๋ชฉ์€ ๋ฆฌ์ŠคํŠธ [5, 6, 7]๊ณผ ์ •์ˆ˜ 8๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฆฌ์ŠคํŠธ [[5, 6, 7], 8]์ด๋‹ค.

์งˆ๋ฌธ: ์œ„ ๋ฆฌ์ŠคํŠธ์—์„œ 2๋ฅผ ์ธ๋ฑ์Šค๋กœ ์–ป๋Š” ๋ฐฉ๋ฒ•์€?

๊ฒฌ๋ณธ๋‹ต์•ˆ:

In [22]:
a_nested_list[1]
Out[22]:
2

์งˆ๋ฌธ: [3, 4]๋ฅผ ์ธ๋ฑ์Šค๋กœ ์–ป๋Š” ๋ฐฉ๋ฒ•์€?

๊ฒฌ๋ณธ๋‹ต์•ˆ:

In [23]:
a_nested_list[2]
Out[23]:
[3, 4]

์งˆ๋ฌธ: 3์„ ์ธ๋ฑ์Šค๋กœ ์–ป๋Š” ๋ฐฉ๋ฒ•์€?

๊ฒฌ๋ณธ๋‹ต์•ˆ: ์ธ๋ฑ์Šค๋ฅผ ์—ฐ์†ํ•ด์„œ ์ ์šฉํ•œ๋‹ค.

In [24]:
a_nested_list[2][0]
Out[24]:
3

์งˆ๋ฌธ: [5, 6, 7]์„ ์ธ๋ฑ์Šค๋กœ ์–ป๋Š” ๋ฐฉ๋ฒ•์€?

๊ฒฌ๋ณธ๋‹ต์•ˆ: ์—ญ์‹œ ์ธ๋ฑ์Šค๋ฅผ ์—ฐ์†ํ•ด์„œ ์ ์šฉํ•œ๋‹ค.

In [25]:
a_nested_list[3][0]
Out[25]:
[5, 6, 7]

์งˆ๋ฌธ: 7์„ ์ธ๋ฑ์Šค๋กœ ์–ป๋Š” ๋ฐฉ๋ฒ•์€?

๊ฒฌ๋ณธ๋‹ต์•ˆ: ์—ญ์‹œ ์ธ๋ฑ์Šค๋ฅผ ์—ฐ์†ํ•ด์„œ ์ ์šฉํ•œ๋‹ค.

In [26]:
a_nested_list[3][0][2]
Out[26]:
7

연습: 슬라이싱과 인덱싱의 차이점

์•„๋ž˜ ์˜ˆ์ œ๋Š” ์Šฌ๋ผ์ด์‹ฑ๊ณผ ์ธ๋ฑ์‹ฑ์˜ ์ž‘๋™๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์ž˜ ๋ณด์—ฌ์ค€๋‹ค.

๋™๋ฌผ๋“ค์˜ ๋ฆฌ์ŠคํŠธ animals๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜ํ•˜์ž.

In [27]:
animals = ['dog', 'cat', 'pig']

์ด์ œ ์ธ๋ฑ์‹ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ 1๋ฒˆ ์ƒ‰์ธ๊ฐ’์œผ๋กœ cat ๋Œ€์‹ ์— ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ์ธ ['tiger', 'lion', 'rabbit']๋ฅผ ์ง€์ •ํ•ด๋ณด์ž.

In [28]:
animals[1] = ['tiger', 'lion', 'rabbit']

๊ทธ๋Ÿฌ๋ฉด animals๋Š” ์ด ๊ฒฝ์šฐ 2์ค‘ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋œ๋‹ค.

In [29]:
animals
Out[29]:
['dog', ['tiger', 'lion', 'rabbit'], 'pig']

๋ฐ˜๋ฉด์— ์•„๋ž˜์™€ ๊ฐ™์ด ์Šฌ๋ผ์ด์‹ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค.

In [30]:
animals = ['dog', 'cat', 'pig']
animals[1:2] = ['tiger', 'lion', 'rabbit']

์Šฌ๋ผ์ด์‹ฑ์„ ํ™œ์šฉํ•˜๋ฉด 2์ค‘ ๋ฆฌ์ŠคํŠธ ๋Œ€์‹ ์— ํ™•์žฅ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์–ป๊ฒŒ ๋œ๋‹ค.

In [31]:
animals
Out[31]:
['dog', 'tiger', 'lion', 'rabbit', 'pig']

์Šฌ๋ผ์ด์‹ฑ์„ ํ™œ์šฉํ•˜์—ฌ ํŠน์ • ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 2๋ฒˆ ~ 3๋ฒˆ ์ƒ‰์ธ๊ฐ’์ธ tiger์™€ lion์„ ์‚ญ์ œํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

In [32]:
animals[2:4] = []
animals
Out[32]:
['dog', 'tiger', 'pig']

연습: 리스트의 중요 메소드 활용

In [33]:
animals = ['dog', 'cat', 'pig']

๋ฌธ์ž์—ด์— ํฌํ•จ๋œ ๋ฌธ์ž๋“ค์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋“ฏ ๋ฆฌ์ŠคํŠธ์— ํฌํ•จ๋œ ํ•ญ๋ชฉ๋“ค์˜ ์ˆœ์„œ๋„ ์ ˆ๋Œ€์ ์œผ๋กœ ์ค‘์š”ํ•˜๋‹ค. ๋ฌธ์ž์—ด๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋ฆฌ์ŠคํŠธ๋Š” ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, append() ๋ฉ”์†Œ๋“œ๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๋์— ํ•ญ๋ชฉ์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•œ๋‹ค.

In [34]:
animals.append('coq')
animals
Out[34]:
['dog', 'cat', 'pig', 'coq']

๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” append() ๋ฉ”์†Œ๋“œ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

In [35]:
animals.append(['eagle', 'bear'])
animals
Out[35]:
['dog', 'cat', 'pig', 'coq', ['eagle', 'bear']]

์œ„์—์„œ๋Š” ์›๋ž˜์˜ ๋ฆฌ์ŠคํŠธ์— ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ ํ•˜๋‚˜๋ฅผ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์œผ๋กœ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๋‹ค.

๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ eagle๊ณผ bear ๋‘ ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ์›๋ž˜์˜ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด append() ๋ฉ”์†Œ๋“œ๋ฅผ ๋‘ ๋ฒˆ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด extend() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

๋จผ์ € ์•ž์„œ ์ถ”๊ฐ€ํ•œ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜์ž.

In [36]:
animals.remove(['eagle', 'bear'])
animals
Out[36]:
['dog', 'cat', 'pig', 'coq']

extend() ๋ฉ”์†Œ๋“œ์˜ ํ™œ์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

In [37]:
animals.extend(['eagle', 'bear'])
animals
Out[37]:
['dog', 'cat', 'pig', 'coq', 'eagle', 'bear']

๋‘ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ง์…ˆ ๊ธฐํ˜ธ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ™•์žฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์›๋ž˜์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

ํ•ญ๋ชฉ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐ ์ด์™ธ์—๋„ ํ•ญ๋ชฉ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

cat๋ฅผ cow์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋ณด์ž. ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ธ๋ฑ์‹ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค.

In [38]:
animals[1] = 'cow'
animals
Out[38]:
['dog', 'cow', 'pig', 'coq', 'eagle', 'bear']

๋ฆฌ์ŠคํŠธ์— ํฌํ•จ๋œ ํ•ญ๋ชฉ์˜ ์ธ๋ฑ์Šค๋ฅผ ์•Œ๊ณ ์ž ํ•œ๋‹ค๋ฉด index() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.

In [39]:
animals.index('pig')
Out[39]:
2

์ฃผ์˜: ๋งŒ์•ฝ์— 'pig'๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด index() ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ธ๋ฑ์Šค๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

In [40]:
animals.append('pig')
animals
Out[40]:
['dog', 'cow', 'pig', 'coq', 'eagle', 'bear', 'pig']
In [41]:
animals.index('pig')
Out[41]:
2

pop() ๋ฉ”์†Œ๋“œ๋Š” ์ธ์ž๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๋งจ ๋์— ์œ„์น˜ํ•œ ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•˜๋ฉฐ, ์ธ๋ฑ์Šค๋ฅผ ์ธ์ž๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•œ๋‹ค.

In [42]:
animals.pop()
Out[42]:
'pig'
In [43]:
animals.pop(2)
Out[43]:
'pig'

animals์— ํ• ๋‹น๋œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

In [44]:
animals
Out[44]:
['dog', 'cow', 'coq', 'eagle', 'bear']

ํŠน์ • ์ธ๋ฑ์Šค ์œ„์น˜์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ insert() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

In [45]:
animals.insert(5, 'leopard')
animals
Out[45]:
['dog', 'cow', 'coq', 'eagle', 'bear', 'leopard']

์ฃผ์˜: ๊ฐ ๋ฉ”์†Œ๋“œ์˜ ๋ฆฌํ„ด๊ฐ’์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

  • pop(): ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ญ์ œํ•œ ํ•ญ๋ชฉ์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  • append(), remove(), insert() ๋“ฑ์€ ๊ธฐ์กด์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€๋งŒ ๋ฆฌํ„ด๊ฐ’์€ None, ์ฆ‰ ์•„๋ฌด ๊ฒƒ๋„ ๋ฆฌํ„ดํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ฃผ์˜: pop() ๋ฉ”์†Œ๋“œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ๋งจ ๋ ํ•ญ๋ชฉ๋งŒ ์‚ญ์ œํ•œ๋‹ค. ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ๋ชจ๋ฅผ ๊ฒฝ์šฐ์— ํŠน์ • ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด remove() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

In [46]:
animals.insert(2, 'hamster')
print(animals)
['dog', 'cow', 'hamster', 'coq', 'eagle', 'bear', 'leopard']
In [47]:
removed_pet = animals.remove('hamster')
print(animals)
['dog', 'cow', 'coq', 'eagle', 'bear', 'leopard']

์ฃผ์˜:

  • ํŠน์ • ํ•ญ๋ชฉ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ํฌํ•จ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ remove() ๋ฉ”์†Œ๋“œ๋Š” ๋งจ ์™ผ์ชฝ์— ์œ„์น˜ํ•œ ํ•ญ๋ชฉ ํ•˜๋‚˜๋งŒ ์‚ญ์ œํ•œ๋‹ค. ๋” ์‚ญ์ œํ•˜๋ ค๋ฉด ๋˜ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

  • remove(), index() ๋“ฑ์€ ์‚ญ์ œ ๋˜๋Š” ์ฐพ๊ณ ์ž ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์„ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

In [48]:
animals.remove('hamster')
animals
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-48-23a85b0eacf2> in <module>()
----> 1 animals.remove('hamster')
      2 animals

ValueError: list.remove(x): x not in list

์ด์™ธ์— del ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ์˜ ์ผ๋ถ€ ๋˜๋Š” ์ „์ฒด๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜: del ํ•จ์ˆ˜(๋ฉ”์†Œ๋“œ ์•„๋‹˜)๋Š” ๋งค์šฐ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ž˜๋ชปํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‚ญ์ œ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

In [49]:
del animals[-1]
animals
Out[49]:
['dog', 'cow', 'coq', 'eagle', 'bear']
In [50]:
animals_sample = ['dog']
In [51]:
del animals_sample
In [52]:
animals_sample
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-52-2fd0a356f881> in <module>()
----> 1 animals_sample

NameError: name 'animals_sample' is not defined

reverse() ๋ฉ”์†Œ๋“œ๋Š” ๋ฆฌ์ŠคํŠธ์˜ ์ˆœ์„œ๋ฅผ ๋’ค์ง‘๋Š”๋‹ค.

In [53]:
print('๊ธฐ์กด ๋™๋ฌผ ๋ฆฌ์ŠคํŠธ: ', animals)
animals.reverse()
print('๋’ค์ง‘์–ด์ง„ ๋™๋ฌผ ๋ฆฌ์ŠคํŠธ: ', animals)
๊ธฐ์กด ๋™๋ฌผ ๋ฆฌ์ŠคํŠธ:  ['dog', 'cow', 'coq', 'eagle', 'bear']
๋’ค์ง‘์–ด์ง„ ๋™๋ฌผ ๋ฆฌ์ŠคํŠธ:  ['bear', 'eagle', 'coq', 'cow', 'dog']

sort() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ์˜ ํ•ญ๋ชฉ๋“ค์„ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ˆซ์ž์˜ ๊ฒฝ์šฐ๋Š” ํฌ๊ธฐ ์ˆœ์„œ๋Œ€๋กœ.
  • ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ๋Š” ์‚ฌ์ „์‹์œผ๋กœ.
In [54]:
print('๊ธฐ์กด ๋™๋ฌผ ๋ฆฌ์ŠคํŠธ', animals)
animals.sort()
print('์ •๋ ฌ๋œ ๋™๋ฌผ ๋ฆฌ์ŠคํŠธ', animals)
๊ธฐ์กด ๋™๋ฌผ ๋ฆฌ์ŠคํŠธ ['bear', 'eagle', 'coq', 'cow', 'dog']
์ •๋ ฌ๋œ ๋™๋ฌผ ๋ฆฌ์ŠคํŠธ ['bear', 'coq', 'cow', 'dog', 'eagle']

์ฃผ์˜:

  • sort()์™€ reverse() ๋ฉ”์†Œ๋“œ๋Š” ์›๋ž˜์˜ ๋ฆฌ์ŠคํŠธ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.
  • ์›๋ž˜์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ ์ •๋ ฌ๋œ ๋˜๋Š” ๋’ค์ง‘์–ด์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด sorted() ๋˜๋Š” reversed() ํ•จ์ˆ˜(๋ฉ”์†Œ๋“œ ์•„๋‹˜)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
In [55]:
animals.append('horse')
print(animals)
print(sorted(animals))
print(animals)
['bear', 'coq', 'cow', 'dog', 'eagle', 'horse']
['bear', 'coq', 'cow', 'dog', 'eagle', 'horse']
['bear', 'coq', 'cow', 'dog', 'eagle', 'horse']

reversed() ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ๋Š” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ง€ ์•Š๋Š”๋‹ค.

연습

์–ด๋–ค ๋ชจ์ž„์— ๋“ฑ๋กํ•˜๋Š” ์ฐธ๊ฐ€์ž๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

In [56]:
menu_input = 0
name_list = []

while menu_input != 9:
    print("==========")
    print("1. ์ฐธ๊ฐ€ ์—ฌ๋ถ€ ํ™•์ธ")
    print("2. ์ฐธ๊ฐ€ ์‹ ์ฒญ")
    print("3. ์ฐธ๊ฐ€ ์ทจ์†Œ")
    print("4. ์ฐธ๊ฐ€์ž๋ช… ๋ณ€๊ฒฝ")
    print("5. ์ฐธ๊ฐ€๋ช…๋‹จ")
    print("6. ์ฐธ๊ฐ€ ์ธ์›์ˆ˜ ํ™•์ธ")
    print("9. ์ข…๋ฃŒ")
    print("==========")

    try:
        menu_input = int(input("์›ํ•˜๋Š” ํ•ญ๋ชฉ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”: "))

        if menu_input == 1:
            name = input("ํ™•์ธํ•  ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”: ")
            if name in name_list:
                print("์ฐธ๊ฐ€์ž ๋ช…๋‹จ์— ์žˆ์Šต๋‹ˆ๋‹ค.")
            else:
                print("์ฐธ๊ฐ€์ž ๋ช…๋‹จ์— ์—†์Šต๋‹ˆ๋‹ค.")

        if menu_input == 2:
            name = input("์ฐธ๊ฐ€ ์‹ ์ฒญํ•  ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”: ")
            name_list.append(name)

        if menu_input == 3:
            name = input("์ฐธ๊ฐ€ ์ทจ์†Œํ•  ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”: ")
            name_list.remove(name)

        if menu_input == 4:
            name = input("๋“ฑ๋กํ•œ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”: ")
            name_re = input("์ˆ˜์ •ํ•  ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”: ")
            index = name_list.index(name)
            name_list[index] = name_re

        if menu_input == 5:
            print("์ฐธ๊ฐ€์ž ๋ช…๋‹จ์€ ", name_list, "์ž…๋‹ˆ๋‹ค.")

        if menu_input == 6:
            print("์ฐธ๊ฐ€ ์ธ์›์ˆ˜๋Š” ", len(name_list), "์ž…๋‹ˆ๋‹ค.")

        if menu_input == 9:
            print("ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.")
            break

    except:
        print("์ •์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.")
==========
1. ์ฐธ๊ฐ€ ์—ฌ๋ถ€ ํ™•์ธ
2. ์ฐธ๊ฐ€ ์‹ ์ฒญ
3. ์ฐธ๊ฐ€ ์ทจ์†Œ
4. ์ฐธ๊ฐ€์ž๋ช… ๋ณ€๊ฒฝ
5. ์ฐธ๊ฐ€๋ช…๋‹จ
6. ์ฐธ๊ฐ€ ์ธ์›์ˆ˜ ํ™•์ธ
9. ์ข…๋ฃŒ
==========
์›ํ•˜๋Š” ํ•ญ๋ชฉ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”: 2
์ฐธ๊ฐ€ ์‹ ์ฒญํ•  ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”: alice
==========
1. ์ฐธ๊ฐ€ ์—ฌ๋ถ€ ํ™•์ธ
2. ์ฐธ๊ฐ€ ์‹ ์ฒญ
3. ์ฐธ๊ฐ€ ์ทจ์†Œ
4. ์ฐธ๊ฐ€์ž๋ช… ๋ณ€๊ฒฝ
5. ์ฐธ๊ฐ€๋ช…๋‹จ
6. ์ฐธ๊ฐ€ ์ธ์›์ˆ˜ ํ™•์ธ
9. ์ข…๋ฃŒ
==========
์›ํ•˜๋Š” ํ•ญ๋ชฉ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”: 2
์ฐธ๊ฐ€ ์‹ ์ฒญํ•  ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”: bob
==========
1. ์ฐธ๊ฐ€ ์—ฌ๋ถ€ ํ™•์ธ
2. ์ฐธ๊ฐ€ ์‹ ์ฒญ
3. ์ฐธ๊ฐ€ ์ทจ์†Œ
4. ์ฐธ๊ฐ€์ž๋ช… ๋ณ€๊ฒฝ
5. ์ฐธ๊ฐ€๋ช…๋‹จ
6. ์ฐธ๊ฐ€ ์ธ์›์ˆ˜ ํ™•์ธ
9. ์ข…๋ฃŒ
==========
์›ํ•˜๋Š” ํ•ญ๋ชฉ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”: 6
์ฐธ๊ฐ€ ์ธ์›์ˆ˜๋Š”  2 ์ž…๋‹ˆ๋‹ค.
==========
1. ์ฐธ๊ฐ€ ์—ฌ๋ถ€ ํ™•์ธ
2. ์ฐธ๊ฐ€ ์‹ ์ฒญ
3. ์ฐธ๊ฐ€ ์ทจ์†Œ
4. ์ฐธ๊ฐ€์ž๋ช… ๋ณ€๊ฒฝ
5. ์ฐธ๊ฐ€๋ช…๋‹จ
6. ์ฐธ๊ฐ€ ์ธ์›์ˆ˜ ํ™•์ธ
9. ์ข…๋ฃŒ
==========
์›ํ•˜๋Š” ํ•ญ๋ชฉ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”: 9
ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.