본문 바로가기
개발일지/Python

2022.02.01 파이썬 정복 9장 리스트와 튜플

by 개발에정착하고싶다 2022. 2. 1.
320x100
'''
# 9장 리스트와 튜플

namescore=["최상미",88,"이한승",98] # 리스트에 숫자와 문자를 섞어 쓰는게 일반적이진 않다.

# 해설지 답안
score = [88,95,70,110,90]
sum = 0
for s in score:
    sum +=s
print("총점: ", sum)
print("평균: ", int(sum/len(score)))

# 원리 카피 코드
score = [88,90,60,10,100]
sum=0

for i in score:
    sum += i

#sum = str(sum)
print("총점: ",sum,"점") # str+str+str같이 동일 성질의 것일때 +++로 이어붙이기가 가능했다. 다른 성질일때는 ,,,,로 이어붙이는 것같다.
print("평균점수: ",sum/len(score),"점") # 바로 위의 print에서 출력하기 위해서 20번째 줄에서 str로 성질변화를 주었다. \
# 하지만 이번에는 나눗셈이라는 수식이 있기 때문에 str/int는 불가하기 때문에 에러가 나온다.

print(list("korea")) #""안에 있는 모든 글자를 하나씩 분해

num = [0,1,2,3,4,5,6,7,8,9]
num[2:5] =[] # 2~4자리의 숫자의 삭제 기능이다. 따라서 여기서는 [0,1,5,6,7,8,9] 가 된다.
del num[4]
print( num) # [0, 1, 5, 6, 8, 9]

lol = [[1,2,3],[4,5],[6,7,8,9]]
print(lol[0])
print(lol[2][1]) # 이게 2번째리스트, 1번째 리스트를 출력해줘라. 가 아니라. 2번째 리스트의 1번째 자리 출력 이구나.

for sub in lol:   # 이 아래의 for문 수식은 각 줄별로 리스트를 출력해서 붙여주는 거구나.
    for item in sub:
        print(item,end=" ") # end 다음 부분에 ""로하면 다 따닥따닥 붙고, " "로 하면 한칸씩 띄어진다.
    print()

# 위의 for 문을 해설에서 좀 더 디테일하게
#for sub in lol:  # 여기서 lol은 "전체 리스트", sub는 "부분 리스트 순회
#    for item in sub:  #sub는 "부분 리스트", item은 "요소 순회"
# 좀더 쉽게 lol은 대분류, sub는 중분류, item은 소분류로 이해하면 된다.

# 해설판

score = [
    [88,76,92,98],
    [65,70,58,82],
    [82,80,78,88]
]

total =0
totalsub=0
for student in score:
    sum = 0
    for subject in student:
        sum += subject
    subjects = len(student)
    print("총점 %d, 평균 %.2f" % (sum,sum/subjects))
    total += sum
    totalsub += subjects

print("전체평균 %.2f" % (total/totalsub))

# 이것도 전체적으로 정말 잘 짜여진 코드 같다.
# 디테일하게 표현되는 것이 참 놀랍다.
# 오늘은 눈이 안보이니 내일 이어서 하도록 하자.
# ======================================================
# 해설판 첫번째 시도 코드 - 처음시도 실패, 두번째 시도 성공

score = [
    [88,76,92,98],
    [65,70,58,82],
    [82,80,78,88]
]

total =0
totalsub = 0

for i in score:
    sum=0
    for s in i:
        sum += s
        subjects = len(i) # 첫번째 시도시 실패했다. 요소(소분류)에 해당하는s의 길이를 체크하는 것으로 써주었기 때문이다.
    print("총점 %d, 평균 %.2f" %(sum,sum/subjects))
    total += sum
    totalsub += subjects

print("전체평균 %.2f"%(total/totalsub))

'''
# 의도한 대로의 시도 - 실패
#for n in range(1,11):
#    print(i*2)
'''
# 해설 1
nums = [n*2 for n in range(1,11)] # Thonny로 돌려봤지만 100% 명확한 것은 알 수 없었다. 다만 추론하기로는 for 다음에 출력되는 n값을 2배로 해준다는 의미같다.
for i in nums:
    print(i,end=",")
'''
# 해설 2
# 위의 해설 1과 같은 출력 값이긴 한데 다른 표현 방식이다. 하지만 리스트 형식으로 출력해준다.
'''
nums = []
for n in range(1,11):
    nums.append(n*2)

print(nums)
'''
'''
# 해설 코드
nums =[1,2,3,4]
nums.append(5)
nums.insert(2,99) # 2번째 자리에 99를 넣겠다. 0,1,2
print(nums)
'''
'''
nums = [1,2,3,4]
nums.append(5) # 2개 이상 쓰니깐 2개 이상은 받을 수가 없다면서 오류가 난다;
nums.insert(2,99)
print(nums)
'''
'''
# 해설코드
list1 = [1,2,3,4,5,6]
list2 = [1,2,3,4]
list1.extend(list2) # 일반 +연산자는 읽기 형태로써의 붙임은 가능하나. 성질자체를 변형시키진 않는다고 한다. 반면 extend는 형태 자체를 새로운 하나로 변형시킨다.
print(list1)
'''

'''
# 리스트는 정말, 보면 이해가 가는데 활용에 있어서는 아직 미숙하다. 좀 소화가 안된달까

score = [88,95,70,100,99,80,78,50]
score.remove(100)
print(score)
del(score[2])
print(score)
score[1:4]=[]
print(score)

# 마지막 수식이 이해가 안되서 다시 정리해보려고 만들었다.
score = [88,95,70,100,99,80,78,50] # 이게 리스트고 위의 것 처럼 빼거나 변형하지 않은 상태이다.
score[1:4]=[] # 이상태에서 1부터 3자리의 숫자라면 95,70,100 이 나와야 정상인것같은데
print(score) # [88, 99, 80, 78, 50] 가 나온다.이를 리스트화 시키자면 0,4,5,6,7 이다.
# 뭔가의 패턴이 있긴 한것같은데 Thonny로도 검토가 되지 않는다.
# 처음으로 stack over flow 에 이 건으로 질문 남겨보았다. 과연.... 나의 영어를 알아듣고 답변이? 
# 와우... 나도 쓰고나서 봤더니 문장 자동교정이 된다... ㄷㄷㄷ.. ㅋㅋㅋㅋㅋ
# 신세계네 내가 쓴 질문이 아닌줄 알았음.
# 답변이 왔는데 번역기를 써도 못알아먹겠다;

'''
'''
score=[88,95,70,100,99,80,78,50]
perfect = score.index(100)+1
print("만점 받은 학생은"+str(perfect)+"번 입니다.")
pernum = score.count(100)
print("만점자 수는"+str(pernum)+"명입니다.")
'''
'''
# 해설 보면서 안보고 시제만 주어진걸 보고 생각하며 해보기 - 성공
score = [88,95,70,100,99,80,78,50]
print("학생 수는 %d명 입니다."% len(score))
print("최고 점수는 %d점 입니다."% max(score))
print("최저 점수는 %d점 입니다."% min(score))
'''
'''
ans = input("결제 하시겠습니까?")
if ans in ["yes","y","ok","예","sure"]:
    print("구입해 주셔서 감사합니다.")
else:
    print("안녕히 가세요")
'''
'''
country = ["Korea","japan","CHINA","america"]
country.sort() # ['CHINA', 'Korea', 'america', 'japan'] # 완전히 정리가 안되었다. 왜냐하면 대문자 -> 소문자 a->z이기 때문이다.
print(country) 
country.sort(key=str.lower) # key=str.lower는 요소자체를 바꾸는건 아니다. 다만 자료를 긁어올때 대소문자를 구분하지 않는것이다.
print(country)

# 원본 유지를 원할 경우는 sort를.
# 아예 원본을 바꿔버린 결과값을 원하면 sorted를 써주면 된다.
'''
#====================================================================================================================
'''
# 튜플
# 튜플은 리스트와 같이 집합을 만든다는 점에서 동일하지만 초기화한 후 편집할 수 없다는 점이 다르다.

score = (88,95,70,100,99)
sum = 0
for s in score:
    sum +=s
print("총점: ",sum)
print("평균: ",sum/len(score))

# 튜플의 구분방법은 ()안에다가 ,로 2개이상으로 구분지어놓은 것이다. ex) (1,2) 혹은 그냥 1,2 라고 해놓은것도 튜플이다. 1, 이것도
# 튜플안의 리스트는 내부의 인덱스를 변경,삭제등을 할 수가 없다.


# 이런식의 활용은 처음 본다.
tu = "이순신","이수일","심순애"
shin,il,ae = tu  # shin이 리스트 0의 개념, il이 리스트 1의 개념, ae가 리스트 2의 개념을 가지게 되는 것 같다.
print(shin)
print(ae)
print(il)
'''
'''
# 튜플이 형태 변형은 안되는 것 같다고 하더니 이제와서는 그 안의 값들을 교환은 가능한 것같다.
# 이를테면 A = 1,2,3  B = 4,5,6 이라고 할때 이 인의 숫자는 교환 가능한것같다.

a,b,c = 1,2,3
print(a,b,c) # 1 2 3
a,b,c = b,c,a
print(a,b,c) # 2 3 1
# 흥미롭다.

# 이 수식은 시간을 표현하는 수식 같은데, 이렇게 쓰이는 건 처음본다. Thonny로 뜯어보자.
import time

def gettime():
    now =time.localtime() # 보니깐 이것도 내장 함수다.
    return now.tm_hour, now.tm_min # 이건 time.localtime이라는 내장함수에 들어있는 디테일한 소분류 함수. 따라서 변형하기 보다 외우자.
                                # 따로 약어로 만들어서 쓸거 아니면, 근데 약어로 삼기에는 빈번하게 쓰이진 않을것같다.

result = gettime()
print("지금은 %d시 %d분입니다."%(result[0],result[1]))
'''
'''
# 시도 첫번째 -  실패
import time

def nowtime():
    now = time.localtime() #time.이후의  localtime이 기억이 안나서 베껴서 했다.
    return now.tm_hour, now.tm_min # 이 부분을 작성하는것도 모르겠어서 베끼면서 했다.

hour = now.tm_hour # 이건 정의되어있지 않은것으로 표현된다. 아래도 마찬가지고. 답변을 보면서 달리 봐야할것 같다.
min = now.tm_min
print("지금은 %d시 %d분 입니다."%(hour,min))
'''
'''
# 시도 두번째 - 실패
import time

def gettime():
    now = time.localtime()
    return now.tm_hour, now.tm_min

print(gettime()) # 이부분을 print가 아니라 별도의 변수로 생성해주는 것이였다. 너무 기계적으로 따라했다.

print("지금은 %d시 %d분 입니다."%(gettime(0),gettime(1)) # 당연히 따라나오는 것도 실패했다.
'''

'''
# 세번째 시도 - 실패, 성공
import time

def gettime():
    now = time.localtime()
    return now.tm_hour, now.tm_min, now.tm_sec

time_value = gettime()
print(time_value)
print("안녕하세요 연예가중개입니다. 지금은 %d시 %d분 %d초이오니 참고해주세요."%(time_value[0],time_value[1],time_value[2]))
# 맨 마지막 줄에서 ValueError: unsupported format character '?' (0xbd84) at index 29 라는 에러가 떠버렸다.;
# 초앞에 d를 안붙였다. ex) %d 하지만 나는 %만
'''
'''
d, m = divmod(7,3)
print("몫",d)
print("나머지",m)
# 이거는 당췌 이해가 안간다. divmod가 뭘까? print 해보자.

print(divmod) #<built-in function divmod>
# 흐음.. 도통 모르겠다. 스킵하자..
'''

'''
튜플은 뭐 보고 설명을 봐도 활용을 아주 약간 할 수 있을 뿐.
리스트와 튜플을 교환 가능하다?
그거는 좀 먼 얘기 같다.
왜 알려주는지도 사실 지금은 무쓸모 인것같다.
'''

# 연습문제
'''
# 1. score 리스트에 성적값 8개를 저장하고 총점과 평균을 구해 출력하라. - 성공

score = [10,90,64,50,60,50,40,80]

total = 0
total_stu = 0
for i in score:
    total += i
    total_stu += len(score)

print("총점: %d점, 평균: %.0f점 입니다. "%(total,total_stu))
'''
'''
# 2. score = [88,95,70,100,99]리스트에서 2번 학생의 성적을 0점으로 변경하라 - 성공

score = [88,95,70,100,99]

score[2] = 0
print(score)
'''

'''
# 3. 리스트 컴프리헨션 문법을 사용하여 1에서 100 사이의 짝수로 구성된 리스트를 생성하라.

# 리스트 컴프리헨션이 뭐냐?
# 잘 모르겠고 일단 1부터 100꺄지의 짝수를 리스트에 넣어보자

list_number = 0

for i in range(101):
    if i %2 == 0:
    i.append[list_number]

print(list_number)
# 변수 안에 숫자를 총합하는 방법은 알겠는데 그걸 리스트로 늘려서 넣는걸 모르겠다.
'''
'''
# 해답 버전 1

li = [n*2 for n in range(1,50)] # 여기를 리스트 모양으로 감싸준 이유가 리스트 형식으로 만들려는건가 보다.
print(li)
'''
'''
# 해답버전 2
li = [n*2 for n in range(1,50)]
print(li)
'''
'''
# 4.n*n for n in range(1,10) if n%3 ==0] 구문을 평이한 루프와 조건문, 연산식으로 풀어서 작성하라.

for i in range(1,10):
    if i%3 ==0:
        print(i,end=" ")

# 이게 맞나 싶지만 왠지 아닌것 같다. 다른것보다 맨 앞의 n*n가 걸린다.
'''
'''
# 해답버전 1
nums = []
for n in range(1,10):
    if n %3==0:
        nums.append(n*n) # append는 이렇게 쓰는거구나. 그리고 n*n의 형태로도 사용이 가능하구나.
for i in nums:
    print(i,end=" ")

# 출제자가 의도했던 바는 단순히 3으로 나누어 지는 숫자를 넣는게 아니라.
# 3으로 나누어지는 숫자의 제곱수를 넣는것이였다.
# 제곱수의 방식은 n*n으로 표현이 되었다.
'''
'''
# 7. 사용자로부터 5개의 성적을 입력받아 리스트에 저장한 후 오름차순으로 정렬하여 출력하라. - 실패

point = [80,50,40,60,70]

point.sort())

print(point)
'''

'''
# 해설코드 1
li =[]
for i in range(1,6):
    score = int(input(str(i)+"번 학생의 성적을 입력하세요 : ")) # 나도 인풋으로 했었다. 하지만 한번에 넣으려고 하니깐
                                                            # 들어가질 않았고 에러가 났다. 이렇게 끊어주는 식으로 넣어야하는데.
    li.append(score) # 구조에 유의 하자. 어디에다가 뭘할래.추가할래(어떤걸 추가할게)
li.sort()
print(li)
'''
300x250