[python] 문자열, 리스트, 딕셔너리 관련 함수

Soy·2023년 9월 11일
0

리스트에 적용할 수 있는 기본 함수 : min(), max(), sum()

  • min(리스트)
  • max(리스트)
  • sum(리스트)
  • 예시
numbers = [103, 52, 273, 32, 77]

print(min(numbers))
print(max(numbers))
print(sum(numbers))
- 실행 결과
32
273
537
  • 리스트를 사용하지 않고
    min(103, 52, 273)
    max(103, 52, 273)
    이런 식으로 사용하는 것도 가능하다.

reversed() 함수로 리스트 뒤집기

  • reversed(리스트)
  • 예시
list_a = [1, 2, 3, 4, 5]
list_reversed = reversed(list_a)
print(list(list_reversed))
- 실행 결과
[5, 4, 3, 2, 1]
  • reversed() 함수의 결과를 보면 리스트를 바로 리턴해주지 않고 이터레이터를 리턴해주는 것을 알 수 있다.

  • reversed() 함수의 결과는 제너레이터이므로 다음과 같은 상황에서 '첫 번째 반복문' 부분만 실행되고, '두 번째 반복문' 부분은 출력되지 않는다.

    reversed() 함수와 반복문을 조합할 때에는 다음과 같이 for 구문 내부에 reversed() 함수를 넣어 사용해야 한다.

enumerate() 함수와 반복문 조합하기

  • enumerate(리스트)
  • 다른 방법
# 방법 1
example_list = ["요소A", "요소B", "요소C"]

count = 0
for i in example_list:
  print("{}번째 요소는 {}입니다.".format(count, i))
  count += 1
# 방법 2
example_list = ["요소A", "요소B", "요소C"]

for i in range(len(example_list)):
  print("{}번째 요소는 {}입니다.".format(i, example_list[i]))
- 실행 결과
0번째 요소는 요소A입니다.
1번째 요소는 요소B입니다.
2번째 요소는 요소C입니다.
  • enumerate() 함수 사용
example_list = ["요소A", "요소B", "요소C"]

# list() 함수로 강제 변환하여 출력
print("enumerate() 함수 적용:", list(enumerate(example_list)))
print()

for i, value in enumerate(example_list):
  print("{}번째 요소는 {}입니다.".format(i, value)) 
- 실행 결과
enumerate() 함수 적용: [(0, '요소A'), (1, '요소B'), (2, '요소C')]

0번째 요소는 요소A입니다.
1번째 요소는 요소B입니다.
2번째 요소는 요소C입니다.
  • enumerate() 함수의 결과를 보면 리스트를 바로 리턴해주지 않고 이터레이터를 리턴해주는 것을 알 수 있다. 그리고 (0, '요소A')를 튜플이라고 부른다.

딕셔너리의 items() 함수

  • 딕셔너리.items()
  • 딕셔너리의 items() 함수와 반복문을 조합한 형태는 리스트의 enumerate() 함수와 반복문을 조합한 형태와 비슷하다.

  • 예시

example_dictionary = {
    "키A": "값A",
    "키B": "값B",
    "키C": "값C"
}

print("items():", example_dictionary.items())
print()

for key, element in example_dictionary.items():
  print("dictionary[{}] = {}".format(key, element))
- 실행 결과
items(): dict_items([('키A', '값A'), ('키B', '값B'), ('키C', '값C')])

dictionary[키A] = 값A
dictionary[키B] = 값B
dictionary[키C] = 값C

리스트 내포

  • 리스트 = [표현식 for 반복자 in 반복할 수 있는 것]
  • 리스트 = [표현식 for 반복자 in 반복할 수 있는 것 if 조건문]
  • 예시 1
# 복잡한 식
array = []

for i in range(0, 20, 2):
	array.append(i*i)
    
print(array)
# 간단한 식
array = [i*i for i in range(0, 20, 2)]
print(array)
- 실행 결과
[0, 4, 16, 36, 64, 100, 144, 196, 256, 324]
  • 예시 2
array = ["사과", "자두", "초콜릿", "바나나", "체리"]
output = [fruit for fruit in array if fruit != "초콜릿"]

print(output)
- 실행 결과
['사과', '자두', '바나나', '체리']

심화: 구문 내부에 여러 줄 문자열 사용시 문제점

문제점

  • 문제점 1 : 들여쓰기(indent) 하여 출력된다.
number = int(input("정수 입력> "))

if number % 2 == 0:
  print("""\
      입력한 문자열은 {}입니다.
      {}는(은) 짝수입니다.""".format(number, number))
else:
  print("""\
      입력한 문자열은 {}입니다.
      {}는(은) 홀수입니다.""".format(number, number))
- 실행 결과
정수 입력> 10
      입력한 문자열은 10입니다.
      10는(은) 짝수입니다.
  • 문제점 2 : 들여쓰기 없이 출력하기 위해서는 코드 구조가 이상해진다.
number = int(input("정수 입력> "))

if number % 2 == 0:
  print("""입력한 문자열은 {}입니다.
{}는(은) 짝수입니다.""".format(number, number))
else:
  print("""입력한 문자열은 {}입니다.
{}는(은) 홀수입니다.""".format(number, number))
- 실행 결과
정수 입력> 10
입력한 문자열은 10입니다.
10는(은) 짝수입니다.
  • 문제점 3 : 구문 내부에서는 여러 줄 문자열을 거의 사용하지 않는 편인데, 그렇다고 한 줄로 길게 적으면 코드가 복잡해진다.
number = int(input("정수 입력> "))

if number % 2 == 0:
  print("""입력한 문자열은 {}입니다.\n{}는(은) 짝수입니다.""".format(number, number))
else:
  print("""입력한 문자열은 {}입니다.\n{}는(은) 홀수입니다.""".format(number, number))

해결방법

  • 해결방법 1 : 괄호로 문자열 연결하기

number = int(input("정수 입력> "))

if number % 2 == 0:
  print((
      "입력한 문자열은 {}입니다.\n"
      "{}는(은) 짝수입니다."
      ).format(number, number))
else:
  print((
      "입력한 문자열은 {}입니다.\n"
      "{}는(은) 홀수입니다."
  ).format(number, number))
  • 해결방법 2 : 문자열의 join() 함수
    • 문자열.join(문자열로 구성된 리스트)
      : '리스트의 요소'를 '문자열'로 연결
number = int(input("정수 입력> "))

if number % 2 == 0:
  print("\n".join([
      "입력한 문자열은 {}입니다.",
      "{}는(은) 짝수입니다."
      ]).format(number, number))
else:
  print("\n".join([
      "입력한 문자열은 {}입니다.\n"
      "{}는(은) 홀수입니다."
  ]).format(number, number))

심화: 이터레이터

  • for 반복자 in 반복할 수 있는 것
    (반복할 수 있는 것 = iterable(이터러블))
  • 이터러블(iterable): 내부에 있는 요소들을 차례로 꺼낼 수 있는 객체. 리스트, 딕셔너리, 문자열, 튜플 등이 있다.

  • 이터레이터(iterator): enumerate() 함수나 reversed() 함수의 리턴값이 이터레이터이다. 이는 반복문의 매개변수로 전달할 수 있으며, next() 함수를 적용해 내부의 요소를 하나하나 꺼낼 수 있다.

  • 예시

numbers = [1, 2, 3, 4, 5, 6]
r_num = reversed(numbers)

print(r_num)
print(next(r_num))
print(next(r_num))
print(next(r_num))
print(next(r_num))
print(next(r_num))
- 실행 결과
<list_reverseiterator object at 0x7854556b5510>
6
5
4
3
2
  • 리스트를 바로 리턴하는 대신 이터레이터를 리턴하는 이유: 메모리의 효율성을 위해서이다. 길이가 아주 긴 리스트를 복제한 뒤 뒤집어서 리턴하는 것보다는 기존에 있던 리스트를 활용해서 작업하여 훨씬 효율적이다.

연습 문제

  • 1 ~ 100을 2진수로 변환했을 때 0이 하나만 포함된 숫자 및 그 숫자의 합 구하기
    • 참고 : 10진수와 2진수 변환

      # 2진수 변환
      "{:b}".format(10)
      
      # 10진수 변환
      int("1010", 2)
    • 참고 : count() 함수 - 문자열, 리스트, 범위 등 반복 가능한 객체에서 사용

      "안녕안녕하세요".count("안")
      ## 실행결과 : 2

도전문제

  • 문제1: 숫자의 종류

  • 문제2: 염기의 개수

    • 책 정답

    • 나의 정답

  • 문제3: 염기 코돈 개수

    • 책 정답

    • 나의 정답

  • 문제4: 2차원 리스트 평탄화
    (중첩되어 있는 리스트에서 중첩을 제거하는 처리를 리스트 평탄화(list flatten)이라고 한다.)

profile
Big dreamer

0개의 댓글