pype 6주차 과제 코드
by Namnani
Q1. dictionary로 중복 체크.
📌Q1. 역사 문제를 하나 내보겠습니다. 고려시대와 조선시대 왕 이름 중에서 고려에도 있고 조선에도 있는 이름은 몇개 일까요? 한 번에 딱 안 떠오른다면 왕 이름을 드릴테니 파이썬 함수로 만들어서 출력 해봅시다. 😲조건1 - 중복되는 왕 이름 출력 😲조건2 - 중복되는 왕 이름의 수 출력
# 왕이름
korea_king = "태조,혜종,정종,광종,경종,성종,목종,현종,덕종,정종,문종,순종,선종,헌종,숙종,예종,인종,의종,명종,신종,희종,강종,고종,원조,충렬왕,충선왕,충숙왕,충혜왕,충목왕,충정왕,공민왕,우왕,창왕,공양왕"
chosun_king = "태조,정종,태종,세종,문종,단종,세조,예종,성종,연산군,중종,인종,명종,선조,광해군,인조,효종,현종,숙종,경종,영조,정조,순조,헌종,철종,고종,순종"
✅출력 예시
king(korea_king, chosun_king)
조선과 고려에 모두 있는 왕 이름 : 태조
조선과 고려에 모두 있는 왕 이름 : 정종
조선과 고려에 모두 있는 왕 이름 : 경종
조선과 고려에 모두 있는 왕 이름 : 성종
조선과 고려에 모두 있는 왕 이름 : 현종
조선과 고려에 모두 있는 왕 이름 : 문종
조선과 고려에 모두 있는 왕 이름 : 순종
조선과 고려에 모두 있는 왕 이름 : 헌종
조선과 고려에 모두 있는 왕 이름 : 숙종
조선과 고려에 모두 있는 왕 이름 : 예종
조선과 고려에 모두 있는 왕 이름 : 인종
조선과 고려에 모두 있는 왕 이름 : 명종
조선과 고려에 모두 있는 왕 이름 : 고종
조선과 고려에 모두 있는 왕 이름은 총 13개 입니다
🌳정답 예시 코드
def king(korea, chosun):
king_dict = dict() # 왕 이름을 담을 dict
korea = korea.split(",") # 문자열을 ,기준으로 list 변경
chosun = chosun.split(",") # 문자열을 ,기준으로 list 변경
# 고려의 왕 이름 저장 후 값을 1로 설정
for kor in korea:
king_dict[kor] = 1
# 조선의 왕 탐색
for cho in chosun:
if king_dict.get(cho, 0) >= 1: # 왕 이름이 존재 여부 있으면 1이상의 값이 나옴
king_dict[cho] = king_dict[cho] + 1 # 존재하면 +1
else:
continue # 없으면 건너 뜀
# 리스트 컴프리헨션을 사용하면 아래 코드
# repeated_king = [ k for (k, v) in king_dict.items() if v >= 2 ]
repeated_king = [] # 중복된 왕 이름을 담는 리스트
for (k,v) in king_dict.items():
if v >= 2: # 왕 이름이 2이상이면 중복된 것
repeated_king.append(k)
count = 0 # 카운트 변수
for king in repeated_king:
print(f"조선과 고려에 모두 있는 왕 이름 : {king}")
count = count + 1 # 존재하면 +1
print(f"조선과 고려에 모두 있는 왕 이름은 총 {count}개 입니다")
# 10라인 : 문제에 없는 조건인거 같긴한데요, 넣으시려 하신다면, 아래 가이드 문구랑 매칭되게 의미하시는 숫자는 2가 앙닐까 싶습니다.
# 13라인 : 반드시 return을 해주셔야 합니다.. 재귀를 쓰시는 건 너무 좋은데, 재귀 종료를 어떻게 해줘야할지만, 잘 신경쓰시면 완벽하실 거 같습니다.
# 15라인 : 위의 if문에서 어차피 걸릴거기 때문에, 개인적으로 이 if문은 의미가 없는 것 같습니다
# 18라인 : 리턴 해주지 않으면, 안됩니다.. 재귀를 쓰시는 건 너무 좋은데, 재귀 종료를 어떻게 해줘야할지만, 잘 신경쓰시면 완벽하실 거 같습니다.
# Define function
def Inputchecker(names):
names = names.strip()
# check whether numbers of king's names is too small
if len(names.split(",")) <= 3:
print("Input error! Enter at least three kings name!")
re = input("Enter king's names again(divide names by ','): ")
return Inputchecker(re)
# check whether names are divided with comma
if "," not in names:
print("Input error! Divide names with ','")
re = input("Enter king's names again(divide names by ','): ")
return Inputchecker(re)
return names
def OverlappedKingFinder(korea,chosun):
# make king name list of korea and chosun each.
ko_kings_lst = korea.split(",")
cho_kings_lst = chosun.split(",")
kings_dic = dict()
# First, make dictionary of korea kings.
for ko_king in ko_kings_lst:
kings_dic[ko_king] = kings_dic.get(ko_king,0) + 1
# Combine Chosun kings with Korea kings
for cho_king in cho_kings_lst:
kings_dic[cho_king] = kings_dic.get(cho_king,0) + 1
# Check and print out the overlapped names
count = 0
for k , v in kings_dic.items():
if v >= 2:
print(f"King's name Belong to both Korea and Chosun:{k}")
count = count + 1
print(f"Number of King's names Belong to both Korea and Chosun:{count}")
#-----------------Main-----------------
print("--------------- Overlapped King's name Finder ---------------")
# Korea kings: 태조,혜종,정종,광종,경종,성종,목종,현종,덕종,정종,문종,순종,선종,헌종,숙종,예종,인종,의종,명종,신종,희종,강종,고종,원조,충렬왕,충선왕,충숙왕,충혜왕,충목왕,충정왕,공민왕,우왕,창왕,공양왕
Korea_kings = Inputchecker(input("Enter all the king's name of Korea Dynasty(divide names by ','): "))
# Chosun kings: 태조,정종,태종,세종,문종,단종,세조,예종,성종,연산군,중종,인종,명종,선조,광해군,인조,효종,현종,숙종,경종,영조,정조,순조,헌종,철종,고종,순종
Chosun_kings = Inputchecker(input("Enter all the king's name of Chosun Dynasty(divide names by ','): "))
print("----------------- The result of calcaulation ----------------")
OverlappedKingFinder(Korea_kings,Chosun_kings)
Q2. dict 사용 + tuple을 이용한 정렬.
📌Q2. 여러분은 6명의 멤버를 거느리는 영업팀의 영업관리자 입니다. 각 멤버별로 올해 실적을 보고 잘한 멤버는 보너스를 주고 못한 멤버는 면담을 하려고 합니다. 파이썬을 이용하여 함수를 만들어 보너스 대상자와 면담 대상자를 골라주세요.
😲조건 1 - 예비 보너스 대상자는 평균 실적 1등 2등 입니다. 😲조건 2 - 예비 면담 대상자는 평균 실적 5등 6등 입니다. 😲조건 3 - 보너스 대상자의 평균 실적이 5보다 크지 않으면 보너스 대상자에서 제외 됩니다. 😲조건 4 - 면담 대상자의 평균 실적이 3보다 크면 면담 대상자에서 제외 됩니다.
# 이름, 실적
member_names = ["갑돌이", "갑순이", "을돌이", "을순이", "병돌이", "병순이"]
member_records = [[4,5,3,5,6,5,3,4,1,3,4,5],[2,3,4,3,1,2,0,3,2,5,7,2],
[1,3,0,3,3,4,5,6,7,2,2,1],[3,2,9,2,3,5,6,6,4,6,9,9],
[8,7,7,5,6,7,5,8,8,6,10,9],[7,8,4,9,5,10,3,3,2,2,1,3]]
✅출력 예시
sales_management(member_names, member_records)
보너스 대상자 병돌이
보너스 대상자 을순이
면담 대상자 갑순이
🌳정답 코드 예시
def sales_management(names, records):
record_dict = dict() # 멤버의 실적을 기록할 dict 생성
# 실적 기록
for i in range(len(names)):
record_dict[names[i]] = records[i]
# 실적을 평균으로 바꿔서 저장
for (k,v) in record_dict.items():
total = 0
for i in v:
total = total + i
mean = total / len(v)
record_dict[k] = mean
# 평균 실적이 높은 순서대로 저장
ranking = [ (v,k) for k,v in record_dict.items() ]
ranking = sorted(ranking, reverse=True)
# 예비 보너스, 면담 대상자 저장
bonus_names = (ranking[0][1], ranking[1][1])
counsel_name = (ranking[4][1], ranking[5][1])
# 5보다 작으면 보너스 대상자 제외
for bn in bonus_names:
if record_dict[bn] < 5:
continue
print(f"보너스 대상자 {bn}")
print()
# 3보다 높으면 면담 대상자 제외
for cn in counsel_name:
if record_dict[cn] > 3:
continue
print(f"면담 대상자 {cn} ")
import numpy
def sales_management(names, records):
record_dict = dict() # dictionary for record
for i in range(len(names)):
record_dict[names[i]] = numpy.mean(records[i]) # calcuate the mean of scores
ranking = [(v, k) for k, v in record_dict.items()] # rearange the data to 2D list (mean, name)
ranking = sorted(ranking, reverse=True) # sort
# reject bonus if the score is lower than 5
for bn in [ranking[0][1], ranking[1][1]]: # check the 2 highest ranking
if record_dict[bn] < 5:
continue
print(f"보너스 대상자 {bn}")
print()
# reject consulting if the score is higher than 3
for cn in [ranking[4][1], ranking[5][1]]: # check the 2 lowest ranking
if record_dict[cn] > 3:
continue
print(f"면담 대상자 {cn} ")
# read data from file
member_names = []
member_records = []
with open('data.csv', 'r') as f:
for line in f:
member_names.append(line.strip('\n').split(',')[0]) # sort name
member_records.append(list(map(int, line.strip('\n').split(',')[1:]))) # sort records as tpye of list
sales_management(member_names, member_records)
## data.csv
갑돌이,4,5,3,5,6,5,3,4,1,3,4,5
갑순이,2,3,4,3,1,2,0,3,2,5,7,2
을돌이,1,3,0,3,3,4,5,6,7,2,2,1
을순이,3,2,9,2,3,5,6,6,4,6,9,9
병돌이,8,7,7,5,6,7,5,8,8,6,10,9
병순이,7,8,4,9,5,10,3,3,2,2,1,3
Q3. dictionary + tuple을 사용한 정렬.
📌Q3. 예금 금리가 너무 낮아서 주식을 시작했습니다. 아래와 같이 매수한 종목 이름, 수량, 매수 평균 금액이 있습니다. 판매가는 따로 주어집니다. 종목과 수익률만 출력하시고 종목별 수익률이 높은 순서대로 출력해주세요. (소수 둘째자리까지 출력)
stocks = "삼성전자/10/85000,카카오/15/130000,LG화학/3/820000,NAVER/5/420000"
sells = [82000, 160000, 835000, 410000]
# 소수 둘째자리까지 출력하는 방법
a = 3.141592
print(f"{a:.3}")
3.14
✅출력 예시
stock_profit(stocks, sells)
카카오의 수익률 23.1
LG화학의 수익률 1.83
NAVER의 수익률 -2.38
삼성전자의 수익률 -3.53
🌳정답 코드 예시
def stock_profit(stocks, sells):
stocks = stocks.split(',') # , 기준으로 분리
stocks = [ s.split("/") for s in stocks ] # / 기준으로 분리
# 종목명, 수량, 매수평균금액, 종목별수익률을 저장할 dict 생성
profit_dict = dict()
profits = [] # 종목별수익률을 저장할 리스트
# stocks 리스트를 반복하며 dict로 데이터 옮기기
for stock in stocks:
# 없으면 키 생성하고 값을 리스트로 저장
# 존재하면 리스트에 추가
if profit_dict.get("종목명", "") == "":
profit_dict["종목명"] = [stock[0]]
else:
profit_dict["종목명"].append(stock[0])
if profit_dict.get("수량", 0) == 0:
profit_dict["수량"] = [int(stock[1])]
else:
profit_dict["수량"].append(int(stock[1]))
if profit_dict.get("매수평균금액", 0) == 0:
profit_dict["매수평균금액"] = [int(stock[2])]
else:
profit_dict["매수평균금액"].append(int(stock[2]))
# 수익률 = ((매도가 - 매수가) / 매수가) X 100
for i in range(len(sells)):
profit = ((sells[i] - profit_dict["매수평균금액"][i]) / profit_dict["매수평균금액"][i]) * 100
profits.append(profit)
profit_dict["종목별수익률"] = profits
# 종목명과 수익률만 저장할 dict생성
answer_dict = dict()
# 종목명에 수익률 대응시켜 저장
i = 0
for name in profit_dict["종목명"]:
answer_dict[name] = profit_dict["종목별수익률"][i]
i = i + 1
# 정렬
answer_list = [(v, k) for (k,v) in answer_dict.items() ]
answer_list = sorted(answer_list ,reverse=True)
# 출력
for i in answer_list:
print(f"{i[1]}의 수익률 {i[0]:.3}")
def investmentresult():
try:
stocklist=input('"기업명1/주식수(주)/매수가(원), 기업명2/주식수(주)/매수가(원), ..."의 형식으로 매수내역을 입력해주세요!: ')
sellprices=input('위에 입력한 주식 순서대로 매도가를 "매도가1, 매도가2, 매도가3,..."의 형식으로 매도내역을 입력해주세요!: ')
stocklist=stocklist.split(', ')
sellprices=sellprices.split(', ')
stocks=list() #기업명끼리 분류
numbers=list() #주식수끼리 분류
buyprices=list() #매수가끼리 분류
for a in stocklist:
a=a.split('/')
stockname=a[0]
stocknumber=a[1]
stockbuyprice=a[2]
stocks.append(stockname)
numbers.append(stocknumber)
buyprices.append(stockbuyprice)
buymoneyamounts=list() #투자금액을 분류
sellmoneyamounts=list() #매도금액을 분류
pricechanges=list() #차익을 분류
percents=list() #수익률을 분류
print('------------------------------------------------------------------------------------------------------------------\n투자건별 수익률은 다음과 같습니다!\n')
for i in range(len(stocks)):
buymoney=float(buyprices[i])*float(numbers[i])
buymoneyamounts.append(buymoney)
sellmoney=float(sellprices[i])*float(numbers[i])
sellmoneyamounts.append(sellmoney)
pricechange=(float(sellprices[i])-float(buyprices[i]))*float(numbers[i])
pricechanges.append(pricechange)
percent=(float(sellprices[i])-float(buyprices[i]))/float(buyprices[i])*100
percents.append(percent)
# 문제에서 소수점 둘째자리까지 하려면 :.3 하면 된다고 했지만 수익률이 10%를 넘어가는 순간 소수점 한자리까지만, 수익률이 100% 넘으면 소수점 아래는 나오지 않는다.
# 그러므로 수익률의 범위에 따라 조정이 필요. 사실 수익률이 10000%가 넘어가는 순간에는 소수점 아래 자리 수는 의미가 별로 없기 때문에 조정은 1000%까지만 설정.
# 손해를 볼 수도 있으니 마이너스 수익률에도 같은 조정이 필요.
if percents[i]>=1000 or percents[i]<=-1000:
percents[i]=f"{percents[i]:.6}"
elif percents[i]>=100 or percents[i]<=-100:
percents[i]=f"{percents[i]:.5}"
elif percents[i]>=10 or percents[i]<=-10:
percents[i]=f"{percents[i]:.4}"
elif percents[i]>=1 or percents[i]<=-1:
percents[i]=f"{percents[i]:.3}"
elif percents[i]<1 and percents[i]>-1:
percents[i]=f"{percents[i]:.2}"
print(str(i+1)+'번째 투자건',[str(stocks[i])],'에 대한 투자금액은', str(int(buymoneyamounts[i]))+'원이며, 투자이익(손해)는', str(int(pricechanges[i]))+'원입니다. 따라서 수익률은', str(percents[i])+'%입니다.')
if float(percents[i])>0:
print('수익을 보고 계십니다. 축하드립니다. 명심하세요. 항상 익절은 옳습니다!')
elif float(percents[i])==0:
print('수익도 손해도 보고 있지 않습니다. 기다려보죠!')
else:
print('안타깝지만 손해를 보고 계십니다. 물을 타거나 손절을 준비하시는게 좋습니다!')
print('\n------------------------------------------------------------------------------------------------------------------\n다음은 주식별 수익률입니다!\n')
# 문제에서 더 나아가 개선할 점이 존재. 문제에서는 한 주식에 대한 한번만 투자. 하지만 한 주식을 한번 만 사는게 아니라 여러 번 살 경우도 다 반영할 수 있도록 만드는게 중요. 투자에서 핵심인 평단가와 수량도 나타내면 좋을 것 같다.
individualbuymoneyamounts=dict()
individualsellmoneyamounts=dict()
individualamounts=dict()
for j in range(len(stocks)):
individualstock=stocks[j]
individualbuymoneyamounts[individualstock]=individualbuymoneyamounts.get(individualstock,0)+buymoneyamounts[j]
individualsellmoneyamounts[individualstock]=individualsellmoneyamounts.get(individualstock,0)+sellmoneyamounts[j]
individualamounts[individualstock]=individualamounts.get(individualstock,0)+int(numbers[j])
individualaveragebuyprices=dict()
individualaveragesellprices=dict()
for k in range(len(stocks)):
individualstock=stocks[k]
individualaveragebuyprices[individualstock]=individualbuymoneyamounts[individualstock]/individualamounts[individualstock]
individualaveragesellprices[individualstock]=individualsellmoneyamounts[individualstock]/individualamounts[individualstock]
individualstocknames=list(individualaveragebuyprices)
for h in range(len(individualstocknames)):
individualyield=(individualaveragesellprices[individualstocknames[h]]/individualaveragebuyprices[individualstocknames[h]]-1)*100
if individualyield>=1000 or individualyield<=-1000:
individualyield=f"{individualyield:.6}"
elif individualyield>=100 or individualyield<=-100:
individualyield=f"{individualyield:.5}"
elif individualyield>=10 or individualyield<=-10:
individualyield=f"{individualyield:.4}"
elif individualyield>=1 or individualyield<=-1:
individualyield=f"{individualyield:.3}"
elif individualyield<1 and individualyield>-1:
individualyield=f"{individualyield:.2}"
print('['+str(individualstocknames[h])+']의 평단가는',str(int(individualaveragebuyprices[individualstocknames[h]]))+'원이고 수익률은', str(individualyield)+'%입니다!')
if float(individualyield)>0:
print('수익을 보고 계십니다. 축하드립니다. 명심하세요. 항상 익절은 옳습니다!')
elif float(individualyield)==0:
print('수익도 손해도 보고 있지 않습니다. 기다려보죠!')
else:
print('안타깝지만 손해를 보고 계십니다. 물을 타거나 손절을 준비하시는게 좋습니다!')
print('\n------------------------------------------------------------------------------------------------------------------\n마지막으로 총투자수익률입니다!\n')
totalinvest=sum(buymoneyamounts[:])
totalprofit=sum(pricechanges[:])
totalyield=totalprofit/totalinvest*100
if totalyield>=1000 or totalyield<=-1000:
totalyield=f"{totalyield:.6}"
elif totalyield>=100 or totalyield<=-100:
totalyield=f"{totalyield:.5}"
elif totalyield>=10 or totalyield<=-10:
totalyield=f"{totalyield:.4}"
elif totalyield>=1 or totalyield<=-1:
totalyield=f"{totalyield:.3}"
elif totalyield<1 and totalyield>-1:
totalyield=f"{totalyield:.2}"
print('당신의 총투자액은', str(int(totalinvest))+'원이며 투자이익(손해)은', str(int(totalprofit))+'원입니다. 그러므로 총수익률은', str(totalyield)+'%입니다.')
if float(totalyield)>0:
print('수익을 보고 계십니다. 축하드립니다. 명심하세요. 항상 익절은 옳습니다!')
elif float(totalyield)==0:
print('수익도 손해도 보고 있지 않습니다. 기다려보죠!')
else:
print('안타깝지만 손해를 보고 계십니다. 물을 타거나 손절을 준비하시는게 좋습니다!')
except:
print('\n양식에 맞게 다시 시도해주세요! 띄어쓰기, 콤마 등을 주의해주세요!\n')
investmentresult()
print('\n----------------------------------------투자 분석기에 오신 걸 환영합니다!----------------------------------------\n')
print('사용하실 때 가장 중요한 것은 양식에 맞추는 것입니다(띄어쓰기, 슬래쉬, 콤마 등).\n만약 삼성전자 주식 1주를 20000원에 매수하시고, 카카오 주식 3주를 175000원에 매수하셨다면 첫번째 질문에서\n\n삼성전자/1/20000, 카카오/3/175000\n\n라고 입력해주세요!\n')
print('그리고 위의 매수한 수량만큼 이후에 삼성전자는 30000원에, 카카오는 180000원에 매도하셨다면 두 번째 질문에서는\n\n30000, 180000\n\n을 입력해주세요!\n')
print('한 주식을 여러번 매수하시고 매도하셨어도 괜찮습니다. 첫 번째 질문에 답하신 순서대로 첫 번째 투자건의 수량만큼 얼마에 매도하셨는지 두 번째 질문에 순서대로 적으시면 됩니다.')
print('\n************ 주의점! ************\n')
print('죄송하지만 첫 번째 매수에서 2주를 매수하시고 이후 추가 매수하셨지만 첫 번째 매도에서 3주를 매도하시는 경우 같은 경우는 저희가 반영하지 못해요.\n매수와 매도 순서대로 꼭 같은 수량이어야 합니다. 첫 매수가 2주였다면 첫 매도도 2주여야 합니다.')
print('위의 한계점은 추후에 계속 개선해나가겠습니다! 기대해주세요~!\n')
print('자 이제 시작합니다!\n------------------------------------------------------------------------------------------------------------------\n')
investmentresult()
print('\n이용해주셔서 감사합니다! 다음에 또 만나요~')
Q4. 조건에 따른 쿠폰 발급 - dict와 tuple을 사용한 정렬문제
📌Q4. 여러분은 어떤 상품을 판매하고 있습니다. 매월 상품을 많이 구매해준 VIP회원에게 할인 쿠폰을 제공해주려고 합니다. 아래와 같은 회원 정보가 있을 때 회원 정보를 출력하고 할인 쿠폰을 받을 회원이 누구인지 출력하는 함수를 만들어 주세요.
😲조건1 - 8회 이상 구매한 회원이 VIP대상 😲조건2 - 전화번호가 없으면 쿠폰을 받을 수 없음 😲조건3 - 전화번호가 없으면 000-0000-0000으로 출력할 것
# 6명의 회원이고 "아이디,나이,전화번호,성별,지역,구매횟수" 순서로 입력되어 있음
info = "abc,21세,010-1234-5678,남자,서울,5,cdb,25세,x,남자,서울,4,bbc,30세,010-2222-3333,여자,서울,3,ccb,29세,x,여자,경기,9,dab,26세,x,남자,인천,8,aab,23세,010-3333-1111,여자,경기,10"
✅출력 예시
good_customer(info)
{'아이디': ['abc', 'cdb', 'bbc', 'ccb', 'dab', 'aab'], '나이': ['21세', '25세', '30세', '29세', '26세', '23세'], '전화번호': ['010-1234-5678', '000-0000-0000', '010-2222-3333', '000-0000-0000', '000-0000-0000', '010-3333-1111'], '성별': ['남자', '남자', '여자', '여자', '남자', '여자'], '지역': ['서울', '서울', '서울', '경기', '인천', '경기'], '구매횟수': [5, 4, 3, 9, 8, 10]}
할인 쿠폰을 받을 회원정보 아이디:aab, 나이:23세, 전화번호:010-3333-1111, 성별:여자, 지역:경기, 구매횟수: 10
🌳정답 코드 예시
def good_customer(info):
# ,를 기준으로 분리
info = info.split(",")
# 정보를 담을 dict 생성
info_dict = dict()
# 정보 6개가 반복되므로 6으로 나눈 나머지를 이용하여 항목 구분하여 저장
for i in range(len(info)):
if i % 6 == 0:
if info_dict.get("아이디", "") == "":
info_dict["아이디"] = [info[i]]
else:
info_dict["아이디"].append(info[i])
elif i % 6 == 1:
if info_dict.get("나이", "") == "":
info_dict["나이"] = [info[i]]
else:
info_dict["나이"].append(info[i])
elif i % 6 == 2:
if info_dict.get("전화번호", "") == "":
info_dict["전화번호"] = [info[i]]
else:
info_dict["전화번호"].append(info[i])
elif i % 6 == 3:
if info_dict.get("성별", "") == "":
info_dict["성별"] = [info[i]]
else:
info_dict["성별"].append(info[i])
elif i % 6 == 4:
if info_dict.get("지역", "") == "":
info_dict["지역"] = [info[i]]
else:
info_dict["지역"].append(info[i])
elif i % 6 == 5:
if info_dict.get("구매횟수" , "") == "":
info_dict["구매횟수"] = [int(info[i])]
else:
info_dict["구매횟수"].append(int(info[i]))
index = [] # 전화번호가 없는 회원의 인덱스 저장
buy = [] # 구매횟수가 8회 이상인 회원 인덱스 저장
for i in range(len(info_dict["전화번호"])):
if info_dict["전화번호"][i] == "x":
index.append(i)
info_dict["전화번호"][i] = "000-0000-0000"
if info_dict["구매횟수"][i] >= 8:
buy.append(i)
# 구매횟수가 8회 넘는 회원 중에 전화번호가 있는 회원 인덱스 저장
true_index = []
for i in buy:
if i not in index:
true_index.append(i)
info_list = list(info_dict.items())
# 정보 출력
print(info_dict)
for i in true_index:
print(f"할인 쿠폰을 받을 회원정보 아이디:{info_list[0][1][i]}, 나이:{info_list[1][1][i]}, 전화번호:{info_list[2][1][i]}, 성별:{info_list[3][1][i]}, 지역:{info_list[4][1][i]}, 구매횟수: {info_list[5][1][i]}")
# 2021. 08. 24. 00:24. Tuesday.
# by nani
# import copy
def good_customer(info):
# 출력 예시에 맞추어, dict 자료형안에, value로는 list가 오도록 변환 작업.
my_dict = dict()
my_dict['아이디'] = []
my_dict['나이'] = []
my_dict['전화번호'] = []
my_dict['성별'] = []
my_dict['지역'] = []
my_dict['구매횟수'] = []
split_info = info.split(',') # 문자열 split.
for i in range(0, 6):
my_dict['아이디'].append(split_info[i * 6])
my_dict['나이'].append(split_info[i * 6 + 1])
# 조건 3 : 전화번호 없으면, 000-0000-0000으로 출력하라.
phone_number = split_info[i * 6 + 2]
if phone_number == 'x':
phone_number = '000-0000-0000'
my_dict['전화번호'].append(phone_number)
my_dict['성별'].append(split_info[i * 6 + 3])
my_dict['지역'].append(split_info[i * 6 + 4])
my_dict['구매횟수'].append(int(split_info[i * 6 + 5])) # 비교를 위해, int형으로 형변환.
# 회원 정보 출력.
print(my_dict)
# 와우.. 강의에 나와서 참고한 파이써닉 코드인데 놀랍네요.
# 아직 낯설어서 가독성은 상당히 후지게 느껴지지만... 파이썬 강력하네요...
my_list = (sorted([(value, index) for index, value in enumerate(my_dict['구매횟수'])], reverse=True))
# 할인 쿠폰 받을 애들 인덱스 저장 리스트.
vip_index_list = []
# 할인 쿠폰을 받을 회원이 누구인지 계산.
# 조건 1 : 구매횟수가 8 이상이고,
# 조건 2 : 해당 인덱스의 애가, 전화번호가 있어야만 대상임.
for value, index in my_list:
if value < 8:
break
if my_dict['전화번호'][index] != '000-0000-0000':
vip_index_list.append(index)
# 출력해야 할 dictionary의 value 값만 따로 리스트로 converting.
temp = list(my_dict.values())
for value in vip_index_list:
print(
f"할인 쿠폰을 받을 회원정보 아이디:{temp[0][value]}, "
f"나이:{temp[1][value]}, "
f"전화번호:{temp[2][value]}, "
f"성별:{temp[3][value]}, "
f"지역:{temp[4][value]}, "
f"구매횟수:{temp[5][value]}")
# 밑에는, enumerate()를 몰랐을 때, 어떻게 하면 인덱스를 계속 알아낼 수 있을지에 대해, list.index()를 이용하는 무식한 쌩쇼 코드입니다.
# 계속 list.index()를 사용하기 위해, 중복되는 value가 있을까봐, 원본을 조작해주다보니, deep copy도 필요하게 됨..
# # 회원 정보 출력.
# print(my_dict)
#
# # 출력을 위한 딥카피 ㅠㅠ. 원본을 조작하고 있기에..
# temp = copy.deepcopy(my_dict)
#
# # 할인 쿠폰을 받을 회원이 누구인지 계산.
# # 조건 1 : 구매횟수를 돌면서, 8 이상인 애들에 대한 인덱스 추가.
# # 조건 2 : 해당 인덱스 애가, 전화번호가 없으면, 나가리.
# vip_index_list = []
# for value in my_dict.get('구매횟수'):
# if value >= 8:
# value_index = my_dict.get('구매횟수').index(value)
# my_dict.get('구매횟수')[value_index] = -1 # value 겹치는 애들이 있을수도 있으니까, -1로 세팅.
# if my_dict.get('전화번호')[value_index] != '000-0000-0000':
# vip_index_list.append(value_index)
#
# temp = list(temp.values())
# for value in vip_index_list:
# print(f"할인 쿠폰을 받을 회원정보 아이디:{temp[0][value]}, 나이:{temp[1][value]}, 전화번호:{temp[2][value]}, 성별:{temp[3][value]}, 지역:{temp[4][value]}, 구매횟수:{temp[5][value]}")
if __name__ == '__main__':
# 6명의 회원이고 "아이디,나이,전화번호,성별,지역,구매횟수" 순서로 입력되어 있음
info = "abc,21세,010-1234-5678,남자,서울,5," \
"cdb,25세,x,남자,서울,4," \
"bbc,30세,010-2222-3333,여자,서울,3," \
"ccb,29세,x,여자,경기,9," \
"dab,26세,x,남자,인천,8," \
"aab,23세,010-3333-1111,여자,경기,10"
good_customer(info)
Subscribe via RSS