라떼는말이야

[python] 숫자(int) 리스트 한 줄에 출력하는 3가지 방법 (반복, join, *) 본문

기타 팁

[python] 숫자(int) 리스트 한 줄에 출력하는 3가지 방법 (반복, join, *)

MangBaam 2022. 5. 5. 02:54
반응형

백준과 같은 곳에선 답안을 출력문으로 받게 된다.

그 중 위와 같이 숫자들을 한 줄로 공백과 함께 출력하는 형태를 자주 접했을 것이다.

보통은 저 숫자들이 리스트에 담겨 있기 때문에 리스트에 숫자들이 담겨 있는 경우 한 줄에 출력해야 한다. 본 포스트에서는 그러한 방법을 몇 개 소개하고자 한다.


li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

반복문 사용


가장 쉽고, 직관적이고, 이해하기 쉬운 방법이다. 꼭 숫자 리스트가 아닌 다른 타입이 들어있어도 가능한 방법이다.

for n in li:
    print(n, end=' ')
print()

단, 주의해야 할 점은 print의 end 속성으로 공백을 설정해야 한다. 기본 값은 개행 문자('\n')로 되어 있다.

개행 문자 대신 공백을 넣은 것이므로 출력이 모두 끝난 후에 개행이 되지 않는다.

그래서 다음 출력할 내용이 남아있다면 print() 함수를 다시 호출해 개행을 해주어야 한다.

 

문자열 변환 후 join으로 묶어서 출력


join 함수는 *리스트에 특정 구분자를 추가해서 문자열로 반환해주는 함수이다.

사실 리스트에 국한되지 않고 iterable한 자료 구조는 모두 가능하다. 단, 해당 자료 구조에 str 형태를 담고 있어야 한다.
iterable한 타입은 list, dict, set, str, tuple, range 등이 있다.

str은 자체가 문자열이기 때문에 바로 join의 인자로 사용할 수 있다.
list, set, tuple은 내부에 문자열을 담고 있으면 join의 인자로 사용할 수 있다
dict 자체는 반복문으로 순회하면 key 값이 나오기 때문에 key가 모두 문자열인 경우 join의 인자로 사용할 수 있다
dict.items()는 튜플의 형태로 출력되기 때문에 join의 인자로 사용할 수 없다. 대신 문자열로 변환하면 사용할 수 있다
range는 int형이기 때문에 join의 인자로 사용할 수 없다. 대신 문자열로 변환하면 사용할 수 있다

 

join 함수 소개

사용 방법은 위 코드와 같이 '구분자'.join(리스트)로 할 수 있다.

 

join 함수 사용

만약 리스트가 문자열 형태로 이루어졌다면 위와 같이 사용할 수 있다.

숫자 리스트는 join 함수 사용 불가

하지만 문자열 타입이 아닌 타입으로 이루어졌다면 에러가 발생된다. str 인스턴스를 요구했지만 int형이 주어졌기 때문에 TypeError가 발생된 모습이다.

join 함수를 사용하기 위해서는 num_list의 모든 요소들을 문자열로 바꿔주면 가능하다.

숫자 리스트 -> 문자열 리스트

이는 위처럼 map 함수를 사용해서 num_list 각각의 요소에 str() 함수를 적용해서 가능하다.

숫자 리스트 -> 문자열 리스트 -> join 함수 사용

그럼 위에서 본 것과 같이 join 함수를 사용해서 원하는 형태로 출력할 수 있다.

 

일반적으로 사용하는 형태

일반적으로는 위와 같이 join 함수 내부에서 map 함수를 바로 사용해서 출력한다.

 

위에서 join 함수는 iterable한 자료 구조를 인자로 사용할 수 있다고 했다. map 역시 iterable한 자료 구조를 인자로 받으며 map의 반환 값인 map 객 역시 iterable하기 때문에 위 처럼 join의 인자로 사용할 수 있는 것이다.

 

일반적으로 사용하는 형태

결과적으로 위와 같은 형태로 사용할 수 있다.

 

Unpacking(*) 사용


파이썬도 다른 언어들과 마찬가지로 가변 인자를 사용할 수 있다. 즉, 어떤 함수를 사용할 때 몇 개의 인자를 받을 지 모르는 상황에서 가변 인자를 사용하면 여러 개의 인자를 함수에 전달 할 수 있다.

대표적으로 print() 와 같은 함수가 있다.

print 함수는 몇 개의 인자를 받을 지 모른다.

print의 선언부를 보면 위와 같은데 print()의 인자로 *args가 있다. 매개변수 이름 앞에 * 을 붙이면 여러 개의 인자(객체)를 하나의 인자(객체)로 받을 수 있다. 이를 Packing이라고 한다.

위 처럼 pack에는 one, two, last에 할당된 값을 제외한 나머지 값들이 들어있다.

*패킹은 리스트나 튜플 안에서 가능하다. 단독으로는 불가하다.
추가로 **처럼 두 개의 별을 붙여서 딕셔너리 형식으로 받을 수도 있다.

packing type

Packing된 변수의 타입은 list이다.

 

이렇게 여러 값들을 묶어주는 packing이 있다면 묶인 값들을 풀어주는 Unpacking도 존재한다.

unpacking

total이라는 함수는 3개의 인자를 받을 수 있다. 4번 라인처럼 직접 3개의 인자를 넣어줘도 되지만 3개의 아이템을 가지고 있는 pack이라는 리스트를 *과 함께 인자에 넣어주면 3개의 아이템을 Unpacking한다.

만약 total이 3개의 인자만을 받을 수 있는 상황에서 4개의 요소를 unpacking 했다면 위와 같이 에러가 발생된다.

 

그렇다면 total 함수의 인자로 가변 인자를 받는다면?

가변 인자 + Unpacking

위 처럼 pack에 몇 개의 인자가 들어 있든지 함수가 받아들일 수 있다.

 

숫자 리스트 출력 설명을 하기 위해 멀리 돌아왔지만 다시 한 번 print() 함수의 선언부를 살펴보자.

 

print() 함수에서는 args라는 이름으로 가변 매개 변수를 받고, sep로 설정된 문자열로 묶어준다. sep는 기본 값으로 공백이다.

이를 활용하면 우리가 원하는 작업을 할 수 있다.

 

Unpaking으로 숫자 리스트 출력

이제 위 코드가 이해가 가는가?

nums에 몇 개의 인자가 있든지 print() 함수에서는 nums의 인자들을 모두 받을 수 있고, 받은 인자들을 공백으로 묶어서 출력해준다.

위와 같이 응용할 수도 있다.

 

개인적으로 가장 간편하고 깔끔한 방법이라고 생각한다. 사실 이 글도 위 방법을 소개하기 위해 작성했다.

 


요약

 

반응형
Comments