[파이썬을 파이썬답게] 배열 뒤집기 & i번째와 i+1번째 원소 (zip)

이상해씨·2024년 2월 7일
0

Python

목록 보기
7/21

배열 뒤집기

  • 2중 for문을 사용하여 row와 column 뒤집기
mylist = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
new_list = [[], [], []]

for i in range(len(mylist)):
    for j in range(len(mylist[i])):
        new_list[i].append(mylist[j][i])
  • zip과 unpacking을 사용하여 리스트 뒤집기
mylist = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
new_list = list(map(list, zip(*mylist)))

i번째와 i+1번째 원소

  • len과 index 사용하는 방법
def solution(mylist):
    answer = []
    for i in range(len(mylist)-1):
        answer.append(abs(mylist[i] - mylist[i+1]))
    return answer

if __name__ == '__main__':
    mylist = [83, 48, 13, 4, 71, 11]    
    print(solution(mylist))
  • zip을 사용하여 원소에 접근하기
def solution(mylist):
    answer = []
    for number1, number2 in zip(mylist, mylist[1:]): # 리스트 전체와 리스트 1:값을 추출하여 zip
        answer.append(abs(number1 - number2))
    return answer

if __name__ == '__main__':
    mylist = [83, 48, 13, 4, 71, 11]    
    print(solution(mylist))

zip 함수

  • 여러 개의 이터러블(iterable, 반복 가능한 객체)을 인자로 받아, 동일한 인덱스에 있는 요소들을 튜플로 묶어서 이터레이터(iterator)를 생성하는 내장 함수

zip 함수에 서로 길이가 다른 리스트가 인자로 들어오는 경우에는 길이가 짧은 쪽 까지만 이터레이션이 이루어 짐

📌 이터레이터(iterator)
파이썬과 같은 프로그래밍 언어에서 컬렉션(리스트, 튜플, 딕셔너리 등과 같은) 또는 스트림의 요소에 순차적으로 접근할 수 있는 객체 __next__()

  • zip 함수로 생성된 이터레이터는 각 이터러블에서 동시에 요소를 하나씩 가져와서 튜플로 묶은 뒤, 이를 차례대로 반환
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
list3 = ['x', 'y', 'z']

zipped = zip(list1, list2, list3)
print(list(zipped))



# [(1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z')]
  • iterable 순회
mylist = [1, 2, 3]
new_list = [40, 50, 60]
for i in zip(mylist, new_list):
    print (i)

(1, 40)
(2, 50)
(3, 60)
  • 여러개의 iterable 순회
for number1, number2, number3 in zip(list1, list2, list3):
   print(number1 + number2 + number3)
  • 복잡한 데이터 구조를 간단하게 처리하거나, 여러 데이터의 동시처리가 필요할 경우 유용하게 사용됨

  • key리스트와 value 리스트로 dict 생성하기

animals = ['cat', 'dog', 'lion']
sounds = ['meow', 'woof', 'roar']
answer = dict(zip(animals, sounds)) # {'cat': 'meow', 'dog': 'woof', 'lion': 'roar'}

unpacking

  • *기호로 사용됨 (수학적 연산자로도 사용됨
  • 반복가능한 객체를 풀어서 각각의 요소를 분리하는데 사용
  • 함수호출, 리스트, 튜플, 세트 등에서 사용
  • 리스트, 튜플, 세트에서의 언패킹
first_list = [1, 2, 3]
second_list = [*first_list, 4, 5]  # second_list는 [1, 2, 3, 4, 5]
  • 딕셔너리에서의 언패킹
def f(a=1, b=2, c=3):
    return a + b + c

args = {'a': 10, 'b': 20, 'c': 30}
result = f(**args)  # args 딕셔너리의 키와 값이 f 함수의 키워드 인자로 전달됨

*의 여부에 따른 Zip 작동

  • *를 사용하지 않고 zip 실행하기
    • mylist 전체를 단일 iterable로 여기기 때문에, 항목을 개별적으로 처리하지 않음
    • mylist 내부의 리스트를 하나의 iterable로 처리
mylist = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

zipped = zip(mylist)
print(list(zipped))  # [([1, 2, 3],), ([4, 5, 6],), ([7, 8, 9],)]

  • *를 사용하여 zip 실행하기
    • 별도의 인자로 zip 함수에 전달하려면, 언패킹 연산자 *를 사용
mylist = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
zipped = zip(*mylist)  # 언패킹 연산자를 사용하여 mylist의 각 요소를 개별적으로 전달
print(list(zipped))  # [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

참고

profile
공부에는 끝이 없다

0개의 댓글