본문 바로가기

컴퓨터 언어/python

Python 5: List + Dictinaray + for루프

Introduction to Lists

Lists:  다양한 종류의 정보의 나열들을 하나의 변수 이름에 저장할 수 있는 데이터 타입

 

list_name = [item_1, item_2]

empty_list = []

 

기본적인 리스트의 구성은 위와 같습니다.

[ ] 이 표시 안에 있는 것들을 items라고 부르며 ,리스트는 빈 리스트로도 구성될 수 있습니다.

list는 string과 비슷하지만, 몇 가지의 차이점이 있습니다.


 Access by Index : list_name[index]

리스트의 각각의 아이템들에 대해서 index를 통해 접근할 수 있습니다.

인덱스는 리스트 내의 아이템들의 위치를 알려주는 주소와 같습니다.

인덱스를 통한 접근은 다음과 같이 진행 할 수 있습니다. 리스트의 인덱스 또한 0부터 시작합니다.

numbers = [5, 6, 7, 8]

print numbers[0] + numbers[2]	#12
print numbers[1] + numbers[3]	#14

 

리스트의 인덱스는 다른 변수들과 비슷한 작동방식을 보입니다.

변수를 할당하는 것 외에도 접근해서 변환하는 것이 가능합니다.

다음 코드를 실행시켜보시면 명백해집니다.

zoo_animals = ["pangolin", "cassowary", "sloth", "tiger"]
zoo_animals[2] = "hyena"

print zoo_animals
#["pangolin", "cassowary", "hyena", "tiger"]
zoo_animals = ["pangolin", "cassowary", "sloth", 123 ]


if len(zoo_animals) > 3: #list에 len을 걸면 list 안의 item 갯수를 묻는다.
 print "The first animal at the zoo is the " + zoo_animals[0]
 print "The second animal at the zoo is the " + zoo_animals[1]
 print "The third animal at the zoo is the " + zoo_animals[2]
 print "The fourth animal at the zoo is the " + str(zoo_animals[3])

 

리스트 값 추가 .append(item)

letters = ['a', 'b', 'c']
letters.append('d')

print len(letters)	#4
print letters	#['a', 'b', 'c', 'd']
# -*- coding: utf-8 -*- suitcase = []

suitcase=[]
suitcase.append("sunglasses")
suitcase.append("water")
suitcase.append("cloth")


list_length = len(suitcase) # suitcase의 길이를 list_length에 할당해주세요


print "There are %d items in the suitcase." % (list_length)
print suitcase

"""There are 3 items in the suitcase.
['sunglasses', 'water', 'cloth']"""

 

리스트 값 삭제 .remove(item)

beatles = ["john","paul","ringo","stuart"]
beatles.remove("stuart")
print beatles
#['john', 'paul', 'ringo']

 

List Slicing  [ x : y : z ]

[ x : y : z ] = x번째 ~ y번째 미만 인덱스를 z만큼 건너뛰며 진행

l = [i ** 2 for i in range(1, 11)]
print l[2:9:2]
#[9, 25, 49, 81]

[2:9] -> 숫자 2~8까지라는 의미가 아닌 2번째~8번째 인덱스라는 의미임

위의 예제의 경우

"1~10의 범위에서 2번째~8번째 인덱스를 2칸씩 건너서 조건에 맞게 출력해라"는 의미로

인덱스는 0번째에서 시작해 2번째(3),4번째(5),6번째(7),8번째(9)를 조건에 맞춰 출력

 

 

[x:] / [:y] / [::z]

to_five = ['A', 'B', 'C', 'D', 'E']

print to_five[3:]
# prints ['D', 'E']

print to_five[:2]
# prints ['A', 'B']

print to_five[::2]
# print ['A', 'C', 'E']


print to_five[::-1]
# ['E', 'D', 'C', 'B', 'A']

print to_five[5:1:-1] #1번 인덱스 전까지 -1씩 역순으로 진행
#['E','D','C']

print to_five[5:0:-2] #0번 인덱스 전까지 -2씩 역순으로 진행
#['E','C']

print to_five[5:0:1] #[], 뒤에서부터 +1 시작하면 값이 없으므로 빈값출력

범위 내에서 출력

my_list = range(1, 11) # List of numbers 1 - 10
print my_list[::2]
#[1, 3, 5, 7, 9]

my_list = range(1, 11)
backwards = my_list[::-1]
print backwards
#[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

to_one_hundred = range(101)
backwards_by_tens = to_one_hundred[::-10]
print backwards_by_tens
#[100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0]
# -*- coding: utf-8 -*- suitcase = []

"""cat,dog,frog 인덱스로 분할해서 각각의 변수에 할당해봅시다."""


animals = "catdogfrog"


# The first three characters of animals

cat = animals[:3]
print cat

# The fourth through sixth characters

dog = animals[3:6]
print dog

# From the seventh character to the end

frog = animals[6:]
print frog

 

upgrade

str = "ABCDEFGHIJ"
start, end, stride = 1, 6, 2
print str[start:end:stride] #BDF

garbled = "!XeXgXaXsXsXeXmX XtXeXrXcXeXsX XeXhXtX XmXaX XI"
message = garbled[::-2]
print message
#I am the secret message!


garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt\
mXXeXsXXXsXaXXXXXXgXeX!XX"
message = filter(lambda x: x != "X", garbled)
print message
#I am another secretmessage!

lambda는 function 페이지 참조

tangerineshower.tistory.com/49

 

.index(item)

반대로, 아이템의 내용을 통해 인덱스에 접근할 수 있는 방법도 있습니다.

animals = ["ant", "bat", "cat"]

print animals.index("bat") #1

 

.insert(index, item)

또 insert 명령문을 통해서 리스트 안에 아이템을 집어넣는 것 또한 가능합니다.

ant 와 bat 사이에 dog 끼워넣고 모든 인덱스가 뒤로 밀리기

 

animals = ["ant", "bat", "cat"]
animals.insert(1, "dog") #1번자리에 dog 넣기 #끼워넣기에는 insert

print animals
#["ant", "dog","bat", "cat"]
# -*- coding: utf-8 -*- suitcase = []

""".index(item) 명령문을 이용해 “duck"의 인덱스를 찾고 그것을 duck_index에 할당해주세요.
그 다음 .insert(index, item) 명령문을 통해 “cobra" 가 바로 그 인덱스에 할당되게 해주세요"""


animals = ["aardvark", "badger", "duck", "emu", "fennec fox"]

duck_index = animals.index("duck")
print duck_index
animals.insert(2,"cobra")

print animals

#2
#['aardvark', 'badger', 'cobra', 'duck', 'emu', 'fennec fox']

 

 

For 루프에 대해서 1

for variable in list_name:

for문 코드수행

 

for a in list_name이 적용되면 index 0번부터 차례로 접근해 for문 코드를 수행하겠다는 의미가 됩니다.

마지막 아이템을 통과하면 for문을 빠져나옵니다. variable은 그 아이템이 할당되는 변수가 됩니다.

 

my_list = [1,9,3,8,5,7]


for number in my_list:
    print number
    
"""    
1
9
3
8
5
7 """


아이템이 각각 제곱수가 되도록 변경해봅시다.

for number in my_list:
    print number**2
    
"""
1
81
9
64
25
49"""

 

 

sort()

sort문을 사용하게 되면 알파벳의 기호에 따라 순서의 정렬이 발생합니다.

 

animals = ["cat", "ant", "bat"]
animals.sort()


for animal in animals:
    print animal

"""ant
bat
cat"""

 

problem) for 문을 사용해서 start_list에 반복문을 적용시키고

.append()구문을 이용해 x**2의 값을 square_list.의 값에 적용시켜봅시다

이후 .sort()구문을 이용해 값을 정려해봅시다. 즉 [1,4,9,16,25] 이 값이 나오도록

 

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

square_list = []

#여기에 코드를 작성해주세요

print square_list

 

sol)

더보기
이게 정답

# -*- coding: utf-8 -*- suitcase = []

"""
problem) for 문을 사용해서 start_list에 반복문을 적용시키고
.append()구문을 이용해 x**2의 값을 square_list.의 값에 적용시켜봅시다
이후 .sort()구문을 이용해 값을 정렬해봅시다.
즉 [1,4,9,16,25] 이 값이 나오게 하면 되는 것이죠."""


start_list = [5, 3, 1, 2, 4]
square_list = []

for a in start_list:
    square_list.append(a**2)

print square_list #[25, 9, 1, 4, 16]

square_list.sort()
print square_list #[1, 4, 9, 16, 25]

 

for ~ in:  사용 미숙

이것은 내 엉터리 오답

# -*- coding: utf-8 -*- suitcase = []

"""
problem) for 문을 사용해서 start_list에 반복문을 적용시키고
.append()구문을 이용해 x**2의 값을 square_list.의 값에 적용시켜봅시다
이후 .sort()구문을 이용해 값을 정렬해봅시다.
즉 [1,4,9,16,25] 이 값이 나오게 하면 되는 것이죠."""


start_list = [5, 3, 1, 2, 4]
square_list = []
for list in start_list:
    print list**2

square_list.append(list)
square_list.sort()


print square_list

 

 


Introduction to Dictinaray

딕셔너리는 리스트와 비슷합니다.

그러나 딕셔너리에서는 인덱스가 아니라, 키(key)라는 새로운 개념을 통해 접근하게 되어있습니다. 키는 스트링일수도, 숫자일 수도 있습니다. 리스트는 [   ]으로 감싸져있지만 딕셔너리는 {   } 이 문자에 감싸지는 것을 원칙으로 삼고 있습니다.

 

d = {'key1' : 1, 'key2' : 2, 'key3' : 3}

 

딕셔너리 d는 3개의 key-value 페어들을 가지고 있습니다. key 'key1'은 value 1을 가르키며 ‘key2'는 ’2'를 'key3'은 ‘3'을 가리키고 있습니다. 딕셔너리는 e-mail address를 유저의 이름과 연결시키는 등 다양한 분야에서 활용 할 수 있습니다.

 

residents = {'Puffin' : 104, 'Sloth' : 105, 'Burmese Python' : 106}

print residents['Puffin']	#104
print residents['Sloth']	#105
print residents['Burmese Python']	#106

딕셔너리 출력

print d.items() / keys() / values()

 

d={
  "name":"sunyoung",
  "age":23,
  "gender":"women"
}

print d.items()	#key와 value 모두 출력
print d.keys()	#key만 출력
print d.values() #value만 출력


#[('gender', 'women'), ('age', 23), ('name', 'sunyoung')]
#['women', 23, 'sunyoung']
#['gender', 'age', 'name']

 

딕셔너리 추가 , len , 삭제,  값 변경

 

List와 마찬가지로 Dictinary는 mutable합니다. 이것은 생성 된 이후에도 변경이 될 수 있다는 것을 의미하는데요. 이것의 장점 중의 하나는 우리가 그 딕셔너리에 새로운 key와 value값을 할당 할 수 있다는 것입니다.

dict_name[new_key] = new_value

 

비어있는 newdict = {}라고 한다면 빈 딕셔너리를 위미합니다. new_list =[]이 빈 리스트를 의미하듯이 말이죠

len()을 딕셔너리에 적용시키면 그것은 key-value의 페어가 몇 페어가 있는지를 의미합니다.

 

+del이라는 명령어로 삭제    del dict_name[key_name]

 

newdict={}
newdict['1234']=123
newdict['123456']=1234

print newdict  #{'1234': 123, '123456': 1234}
print len(newdict) #2

del newdict['1234']
print newdict	#{'123456': 1234}
print len(newdict)	#1

 

+특정한 키에 값을 변경해서 넣고 싶다면    dict_name[key] = new_value

 

# -*- coding: utf-8 -*- suitcase = []

"""problem) 'Sloth'와 'Bengal Tiger'를 zoo_animal에서 삭제해주세요
'Rockhopper penguin'에게 'Arctic Exhibit'대신에 다른 값을 할당해주세요!"""

zoo_animals = {  'Sloth' : 'Rainforest Exhibit',
                 'Bengal Tiger' : 'Jungle House',
                 'Atlantic Puffin' : 'Arctic Exhibit',
                 'Rockhopper Penguin' : 'Arctic Exhibit'}
# 딕셔너리는 여러줄에 걸쳐 쓰일 수도 있습니다.

del zoo_animals['Sloth']
del zoo_animals['Bengal Tiger']

zoo_animals['Rockhopper Penguin']='Korea'
print zoo_animals
#{'Rockhopper Penguin': 'Korea', 'Atlantic Puffin': 'Arctic Exhibit'}

 


For 루프에 대해서 2

# in의 역할

#print number뒤에 ,콤마 찍으면 한줄로 배열된다

for number in range(5):
    print number,
"""0 1 2 3 4"""


---------------------
for number in range(5):
    print number
"""
0
1
2
3
4"""

 

문자열 안의 값도 하나씩 출력 가능

for letter in "Eric":
    print letter,
    #E r i c

 

조건 달기

1.
evens_to_50 = [i for i in range(51) if i % 2 == 0]
#해석: range(51)에서 i%2==0일 때의 i를 evens_to_50이라고 하겠다
print evens_to_50

=

my_list = range(51)
evens_to_50 = [i for i in my_list if i % 2 == 0]
print evens_to_50

#[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50]



2.
new_list = [x for x in range(1, 6)]
doubles = [x * 2 for x in range(1, 6)]
doubles_by_3 = [x * 2 for x in range(1, 6) if (x * 2) % 3 == 0]
#1~5 사이에서 (x * 2) % 3 == 0를 만족할 때, x*2를 doubles_by_3이라고 하자 ->3만 만족

print new_list	
print doubles
print doubles_by_3

#[1, 2, 3, 4, 5]
#[2, 4, 6, 8, 10]
#[6]

 

problem) 12까지의 짝수들만 골라 제곱수를 할당하는 식을 채워주세요
even_squares = ________________________
print even_squares

 

sol)

더보기
even_squares=[x**2 for x in range(1,13) if x%2==0]
print even_squares
#[4, 16, 36, 64, 100, 144]
c = ['C' for x in range(5) if x < 3]
print c
#['C', 'C', 'C']
numbers = [1, 3, 4, 7]
for number in numbers:
    if number > 6:
        print number	#7

 

problem)

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

a에대한 루프문을 이용해서 짝수면 출력하고 홀수면 출력하지 않는 문장을 만들어봅시다

hint)%2 == 0의 방식을 이용해 봅시다

 

sol)

더보기
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
for num in a:
    if num%2==0:
        print num

# 리스트

for loops 는 리스트에 있는 가장 좌측에 있는 아이템부터 우측으로 접근하게 해줍니다.

a = ["List", "of", "some", "sort"]

for item in a: 
   print item

#List
#of
#some
#sort

 

# 딕셔너리

딕셔너리는 리스트처럼 순서대로 출력 X  + d[key] = value 값을 말한다.

d = {
"name": "Eric",
"age": 26
}


1.
for key in d:
    print key, d[key],
#age 26 name Eric


2.
for key in d:
    print key,
    print d[key],
#age name
# 26 Eric

 

Lists + Functions

#10보다 작은 숫자가 몇개인지 알아보는 함수
def count_small(numbers):
    total = 0
    for n in numbers:
        if n < 10:
            total = total + 1
    return total


lotto = [4, 8, 15, 16, 23, 42]
small = count_small(lotto)
print small #2

 

★String Looping

 

problem)

price 라는 이름의 딕셔너리를 만들어봅시다, 각각의 물건의 가격을 의미합니다

"banana": 4, "apple": 2, "orange": 1.5, "pear": 3

stock 이라는 이름의 재고를 갖는 딕셔너리를 만들어봅시다.

 

apple

price: 2

stock: 0

과 같이 각각의 키 값에 대해 가격과 재고를 알려주는 loop문을 만들어봅시다

 

# -*- coding: utf-8 -*- suitcase = []

price={"banana": 4, "apple": 2, "orange": 1.5, "pear": 3}
stock={"banana": 10, "apple": 12, "orange": 3, "pear": 5}


for a in price: #a 안에는 각각의 키 값이 들어간다
    print a
    print "price:"+str(price[a])
    print "stock:"+str(stock[a])
    print
    
    
 """
 orange
price:1.5
stock:3

pear
price:3
stock:5

banana
price:4
stock:10

apple
price:2
stock:12"""

 

sol)

더보기

for food in prices:

print food

print "price: %s" % prices[food]

print "stock: %s" % stock[food]

도 가능

 

problem)

각각의 과일을 전부 팔았을 때의 판매가와, 전체 과일들의 판매가의 총합을 구해봅시다

 

sol)

# -*- coding: utf-8 -*- suitcase = []

price={"banana": 4, "apple": 2, "orange": 1.5, "pear": 3}
stock={"banana": 10, "apple": 12, "orange": 3, "pear": 5}

total=0
for a in price: #a 안에는 각각의 키 값이 들어간다
    print a
    print "price:" + str(price[a])
    print "stock:" + str(stock[a])
    print"판매가:"+str(price[a]*stock[a])
    print
    total += price[a]*stock[a]

print "전체판매가:"+str(total)

"""
orange
price:1.5
stock:3
판매가:4.5

pear
price:3
stock:5
판매가:15

banana
price:4
stock:10
판매가:40

apple
price:2
stock:12
판매가:24

전체판매가:83.5"""

 

sol) 함수로 구현한 경우

price={"banana": 4, "apple": 2, "orange": 1.5, "pear": 3}
stock={"banana": 10, "apple": 12, "orange": 3, "pear": 5}


total = 0
for food in price:
    print food
    print price[food] * stock[food]
    total = total + price[food] * stock[food]
    print total
    print
    
 """
 orange
4.5
4.5

pear
15
19.5

banana
40
59.5

apple
24
83.5
"""

 

# 리스트 안의 값 더하는 함수

def sum(numbers): #n의 인수 1,2,5,10,13이 numbers 안에 인수로 들어가고
    total = 0
    for number in numbers:
        total += number
    return total

n = [1, 2, 5, 10, 13]
print sum(n)	#31

위에서는 sum함수를 만들었고 numbers라는 파라메터를 만들어주었습니다.

n이라는 리스트를 넣어주고 sum 함수를 넣어주었습니다.

 


PRACTICE

딕셔너리에서 특정 키 값으로 접근하는 법

animal = {
  "name": "Mr. Fluffles",
  "sounds": ["meow", "purr"]
}
print animal["name"]	#Mr. Fluffles
print animal["sound"]	#['meow', 'purr']

 

1. 각각의 student 의 리스트에 대해 접근해, 각각의 학생들에게 data를 접근해서 (for문을 사용해야 되겠죠?) 다음의 데이터를 출력하게해주세요

 

print the student's name

print the student's homework

print the student's quizzes

print the student's tests

 

lloyd = {
  "name": "Lloyd",
  "homework": [90.0, 97.0, 75.0 ,92.0],
  "quizzes": [88.0, 40.0, 94.0],
  "tests": [75.0, 90.0]
}
alice = {
  "name": "Alice",
  "homework": [100.0, 92.0, 98.0, 100.0],
  "quizzes": [82.0, 83.0, 91.0],
  "tests": [89.0, 97.0]
}
tyler = {
  "name": "Tyler",
  "homework": [0.0, 87.0, 75.0, 22.0],
  "quizzes": [0.0, 75.0, 78.0],
  "tests": [100.0, 100.0]
}


students = [lloyd, alice, tyler]


for student in students:
  print student["name"]
  print student["homework"]
  print student["quizzes"]
  print student["tests"]
  print
  
  
  
"""
Lloyd
[90.0, 97.0, 75.0, 92.0]
[88.0, 40.0, 94.0]
[75.0, 90.0]

Alice
[100.0, 92.0, 98.0, 100.0]
[82.0, 83.0, 91.0]
[89.0, 97.0]

Tyler
[0.0, 87.0, 75.0, 22.0]
[0.0, 75.0, 78.0]
[100.0, 100.0]
"""

 

2. students에 alice, lloyd , tyler가 채워진 리스트를 만들어봅시다.
get_class_average 라는 함수를 이용해서 학생들의 평균 값을 얻어내고 그 값을 해봅시다.
그 값을 get_letter_grade 를 활용해서 전체 학생들의 평균 grade를 print 해봅시다


"""
1.students에 alice, lloyd , tyler가 채워진 리스트를 만들어봅시다.

2.get_class_average 라는 함수를 이용해서 학생들의 평균 값을 얻어내고 그 값을 해봅시다.

3. 그 값을 get_letter_grade 를 활용해서 전체 학생들의 평균 grade를 print 해봅시다"""

lloyd = {
  "name": "Lloyd",
  "homework": [90.0, 97.0, 75.0, 92.0],
  "quizzes": [88.0, 40.0, 94.0],
  "tests": [75.0, 90.0]
}
alice = {
  "name": "Alice",
  "homework": [100.0, 92.0, 98.0, 100.0],
  "quizzes": [82.0, 83.0, 91.0],
  "tests": [89.0, 97.0]
}
tyler = {
  "name": "Tyler",
  "homework": [0.0, 87.0, 75.0, 22.0],
  "quizzes": [0.0, 75.0, 78.0],
  "tests": [100.0, 100.0]
}

# Add your function below!
def average(numbers):
  total = sum(numbers)
  total = float(total)
  return total/len(numbers)

def get_average(student):
  homework = average(student["homework"])
  quizzes = average(student["quizzes"])
  tests = average(student["tests"])
  return 0.1 * homework + 0.3 * quizzes + 0.6 * tests

def get_letter_grade(score):
  if score >= 90:
    return "A"
  elif score >=80:
    return "B"
  elif score >=70:
    return "C"
  elif score >=60:
    return "D"
  else:
    return "F"

def get_class_average(class_list):
  results = []
  for student in class_list: #3명의 학생들에 대한 리스트값이 전달
    student_avg = get_average(student)
    results.append(student_avg)
  return average(results)

students = [lloyd, alice, tyler]

avg = get_class_average(students)
print(avg)	#83.8666666667
print(get_letter_grade(avg))	#B

get_average라는 함수가 학생의 딕셔너리(like lloyd,alice,or tyler) 를 인풋으로 받고 그들의

가중치된 평균을 반환한다고 해봅시다.

 

1. get_average라는 함수를 정의하고 student라는 이름의 매개변수 하나를 갖는 다는 함술르 정의합니다.

2. homework라는 변수를 만들고 그 안에 studnet["homework"]의 average() 를 이용해 값을 저장해봅시다.

3. 3번을 반복해 "quizzes", "tests"에도 동일하게 적용을 해봅시다.

4. total이라는 변수에 homework 는 10% quizzes 는 30% tests 난 60%의 가중치를 가지게 해서 값을 저장해봅시다

5. 그 값을 반환해봅시다.

 

이번에는 score라는 이름의 매개변수를 받아 작동하는 get_letter_grade 라는 함수를 만들어 볼 생각입니다. 이 함수는 학생이 받아야 하는 성적(string)에 대해 반환합니다. 'score'라는 매개변수를 갖는 ‘get_letter_grade’ 라는 함수를 정의해봅시다. score는 하나의 숫자 값을 받는 것을 예상하고 있습니다.

 

함수 안에 if: / elif: / else: statements를 다음 처럼 이용할 겁니다.

score 가 90 이상: return "A"

Else if score 가 80 이상: return "B"

Else if score 가 70 이상: return "C"

Else if score 가 60 이상: return "D"

else: return "F"

 

‘class list‘ 라는 매개변수를 갖는 get_class_average 함수를 정의해주세요 class_list 는 3명의 학생들에 대한 리스트값이 전달 될 것입니다.

 

1. 함수의 본문(body)에 results라는 빈[emplty] 리스트 생성해주세요.

각각의(for each) class_list 안(in)에 있는 student에 접근해서 get_average(student) 값을 계산하고 results.append() 를 이용해 그 결과 값을 result에 추가시켜 주도록 합시다.

2. average() 함수를 불러들여서 results에 있는 값들의 평균을 반환(return)해주도록 합시다.

'컴퓨터 언어 > python' 카테고리의 다른 글

Python 7. LOOP  (0) 2020.07.15
파이썬 기초1  (0) 2020.07.15
Python 4. 파이썬 함수  (0) 2020.07.14
Python 3. Conditionals ana Control Flow  (0) 2020.07.14
Python 2. String & Console out  (0) 2020.07.14