본문 바로가기
Base/Python

10. 리스트와 딕셔너리 관련 기본 함수 / 리스트 내포 / join함수

by 귀멸 2023. 2. 20.

혼공파 42 ~ 47강

1. 리스트와 딕셔너리 관련 기본 함수

# 리스트 기본 함수

a = [52, 273, 32, 103, 57]

print(max(a)) # 273 리스트 내에 가장 큰 값
print(max(*a)) # 리스트 전개 연산자 활용
print(min(a)) # 32  리스트 내에 가장 작은 값
print(min(*a))

print(sum(a)) # 517 리스트의 합계

# reversed() 함수
# 결과 : 한 번만 사용 가능! (이 후 이터레이터 / 클래스 관련 이유)
for i in reversed(range(0, 10)):
  print(i)

# enumerate() 함수
fruits = ["바나나", "사과", "포도"]
a = enumerate(fruits)
print(list(a)) # [(0, '바나나'), (1, '사과'), (2, '포도')]
# 리스트를 순차적으로 번호를 매겨 튜플 자료형으로 출력
# 결과 한 번만 사용 가능!

for fruit in enumerate(fruits):
  print(fruit[0], fruit[1])

for i, fruit in enumerate(fruits):
  print(i, fruit)

# 딕셔너리 기본 함
# items()

a = {
  "이름": "바나나",
  "가격": 1500,
  "원산지": "말레이시아"
}

for key in a:
  print(key, a[key])

for 키, 값 in a.items():
  print(키, 값)

# 딕셔너리 키, 값을 간단하게 불러올 수 있음

# 구분[?] : 그냥 이렇게 만들어짐.. 외워야 함
## 함수형 프로그래밍 이념
reversed(a)
## 객체 지향 프로그래민 이념
a.items()
# 자동완성 기능에 의지해서 쓰면 된다.

2. 리스트 내포

# 리스트 내포 (List comprehension)
# 반복 가능한 것을 기반으로 새로운 리스트를 만들어내는 문법

# An = 2n + 1 (0 <= n < 10)
# A = {1, 3, 5, 7, 9, ... , 19}
A = []
for i in range(0, 10):
  A.append(2 * i + 1)
print(A) # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

달러 = [155.43, 302.71, 77.46, 131.28]
원화 = []
for dollar in 달러:
  원화.append(dollar * 1399)
print(원화)

# 리스트 내포의 형 (굉장히 자주 사용한다)
# [표현식 for 반복문 + 조건문도 결합 가능]
A = [2 * i + 1 for i in range(0, 10)]
print(A) # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

원화 = [dollar * 1399 for dollar in 달러]
print(원화)

A = [
  2 * i + 1             # 표현식
  for i in range(0, 10) # 반복절
  if i % 2 == 0         # 조건절
]                       # 순서대로 와야함
print(A)

3. join() 함수 - 구문 내부에 여러줄 문자열을 사용했을 때 문제점 해결

number = int(input("정수 입력> "))
# 여러 줄 문자열을 사용 시 코드 가독성을 위해
# 앞쪽을 들여 쓰기하고 싶은데 출력에 영향을 미친다
# 이를 해결하기 위해 다음 2가지 방법을 사용한다.

# 1. 괄호를 사용해서 해결
# 괄호 안에서 여러개의 문자열을 그냥 한줄로 인식
# 잘 사용되지는 않는 문법
if number % 2 == 0:
  print(
    f"입력한 문자열은 {number}입니다. \n"
    f"{number}는(은) 짝수입니다."
  )
# 2. join()를 사용해서 해결 [굉장히 많이 활용]
# print("".join(["A","B","C"]))
else:
  print("\n".join([
    f"입력한 문자열은 {number}입니다.",
    f"{number}는(은) 홀수입니다."
  ]))

# 활용 
A = [
  [3, 2, 4, 5],
  [1, 2, 2, 6],
  [-1, -2, 2, 4]
]
for a in A:
  a = [str(요소) for 요소 in a]
  print(",".join(a))

4. 연습문제

# 1 ~ 100 사이에 숫자를 2진수로 변환했을 때 0이 하나만 포함된 숫자들을 출력하고 그 숫자들의 합을 구하시오.

# 1. 10진수 2진법 변환
f"{10:b}" # 값을 2진수로 변환
f"{10:o}" # 값을 8진수로 변환
f"{10:x}" # 값을 16진수로 변환
int("1010", 2)
int("12", 8)
## 다른 진수를 10진수로 바꿀때는 int() 사용
## 문자열로 다른 진수의 수를 쓰고 , 몇 진수인지 숫자를 씀

for i in range(1, 100 + 1):
  print(f"{i:b}")

# 2. 글자 세기
# count() 함수
  # "1010".count("1") 해당 문자열이 몇개가 있는지 출력
a = []
for i in range(1, 100 + 1):
  변환 = f"{i:b}"
  if 변환.count("0") == 1:
    print(i, ":", 변환)
    a.append(i)

print("합계:", sum(a))


# 위의 문제를 리스트 내포로 다시 써보기

a = [
  i
  for i in range(1, 100 + 1)
  if f"{i:b}".count("0") == 1
]

for i in a:
  print(i, ":", f"{i:b}")
print("합계:", sum(a))
# 리스트에서 몇 가지 종류의 숫자가 몇 번 사용되었는지 구하는 프로그램

A = [1, 2, 3, 4, 1, 2, 3, 1, 4, 1, 2, 3]
counter = {}


for a in A:
  if a not in counter:
    counter[a] = 0
  counter[a] += 1

print(counter)
print(f" 사용된 숫자의 종류는 {len(counter)}개입니다.")

# DNA에서 염기의 개수 세기

A = "ctacaatgtcagtatacccattgcattagccgg"
counter = {}


for a in A:
  if a not in counter:
    counter[a] = 0
  counter[a] += 1

print(counter)
print(f" 사용된 숫자의 종류는 {len(counter)}개입니다.")

# DNA 염기 코돈 개수 문자열을 3개씩 묶기

A = "ctacaatgtcagtatacccattgcattagccgg"
counter = {}

for i in range(0, len(A), 3):
  a = A[i:i+3]
  if len(a) != 3:
    continue
  if a not in counter:
    counter[a] = 0
  counter[a] += 1

print(counter)
print(f" 사용된 숫자의 종류는 {len(counter)}개입니다.")

# 2차원 리스트 평탄화
# 리스트가 중첩되어 있을 떄 중첩을 제거하는 처리를 리스트 평탄화
# [1, 2, [3, 4], 5, [6, 7], [8, 9]] -> [1, 2, 3, 4, 5, 6, 7, 8, 9]

A = [1, 2, [3, 4], 5, [6, 7], [8, 9]]
B = []

for a in A:
  if type(a) == list:
    for i in a:
      # B.append(i)
      B += [i] # 리스트 결합 연산자 활용
  else:
    # B.append(a)
    B += [a]

print(f"{A}를 평탄화하면")
print(f"{B}입니다")

댓글