본문 바로가기
Developer/Ruby

Ruby Enumerable.zip 사용 방법 (루비 배열, 해시 데이터 묶는 방법)

by 김씩씩 2022. 11. 21.

Ruby Enumerable.zip 사용 방법 (루비 배열, 해시 데이터 묶는 방법)

 

Ruby에서 Enumerable(열거 가능)한 객체에는 zip 이라는 메소드가 있습니다.

배열, 해시와 같이 반복문 사용이 가능한 객체zip을 사용하여 zip 메소드를 사용한 객체의 길이 만큼 인수로 전달하는 객체들의 값들의 같은 index에 해당하는 데이터들을 묶어 새로운 배열로 반환해줍니다.

 

Python에서도 내장함수로 zip이 존재하고, JavaScript에서는 이런 기능이 없어 map을 사용해 직접 구현해야합니다.

저같은 경우 2개 이상의 배열에서 같은 인덱스에 존재하는 값들을 반복문을 돌며 사용해야할 때 유용하게 사용하고 있는데요!

그럼 zip 메소드 사용 방법에 대해 알려드리도록 하겠습니다.

 

목차

  • 기본 zip 사용 방법
  • 길이가 다른 객체에 zip 메소드를 사용했을 때
  • 서로 다른 자료형 zip 메소드 사용 (Array와 Hash zip)
  • zip 메소드 결과를 반환하지 않고 바로 사용하는 방법

 

기본 zip 사용 방법

t1_1 = [:a, :b, :c]
t1_2 = [1, 2, 3]
r1 = t1_1.zip(t1_2)
p r1  # [[:a, 1], [:b, 2], [:c, 3]]

t2_1 = [:a, :b, :c]
t2_2 = ["a", "b", "c"]
t2_3 = [1, 2, 3]
r2 = t2_1.zip(t2_2, t2_3)
p r2  # [[:a, "a", 1], [:b, "b", 2], [:c, "c", 3]]

t3_1 = { a1: 1, b1: 2, c1: 3}
t3_2 = { a2: 1, b2: 2, c2: 3}
r3 = t3_1.zip(t3_2)
p r3  # [[[:a1, 1], [:a2, 1]], [[:b1, 2], [:b2, 2]], [[:c1, 3], [:c2, 3]]]

t4_1 = { a1: 1, b1: 2, c1: 3}
t4_2 = { a2: 1, b2: 2, c2: 3}
t4_3 = { a3: 1, b3: 2, c3: 3}
r4 = t4_1.zip(t4_2, t4_3)
p r4  # [[[:a1, 1], [:a2, 1], [:a3, 1]], [[:b1, 2], [:b2, 2], [:b3, 2]], [[:c1, 3], [:c2, 3], [:c3, 3]]]

zip(*other_enums) -> array

방식으로 사용할 수 있습니다.

출력되는 결과값을 보시면 아시겠지만 묶는 데이터들의 같은 index의 값들이 묶여져 반환되는 것을 알 수 있습니다.

 

 

길이가 다른 객체에 zip 메소드를 사용했을 때

t1_1 = [:a, :b, :c, :d]
t1_2 = ["a", "b", "c"]
t1_3 = [1, 2]
p t1_1.zip(t1_2, t1_3)  # [[:a, "a", 1], [:b, "b", 2], [:c, "c", nil], [:d, nil, nil]]
p t1_2.zip(t1_1, t1_3)  # [["a", :a, 1], ["b", :b, 2], ["c", :c, nil]]
p t1_3.zip(t1_1, t1_2)  # [[1, :a, "a"], [2, :b, "b"]]


t2_1 = { a1: 1, b1: 2, c1: 3, d1: 4 }
t2_2 = { a2: 1, b2: 2, c2: 3 }
t2_3 = { a3: 1, b3: 2 }
p t2_1.zip(t2_2, t2_3)  # [[[:a1, 1], [:a2, 1], [:a3, 1]], [[:b1, 2], [:b2, 2], [:b3, 2]], [[:c1, 3], [:c2, 3], nil], [[:d1, 4], nil, nil]]
p t2_2.zip(t2_1, t2_3)  # [[[:a2, 1], [:a1, 1], [:a3, 1]], [[:b2, 2], [:b1, 2], [:b3, 2]], [[:c2, 3], [:c1, 3], nil]]
p t2_3.zip(t2_1, t2_2)  # [[[:a3, 1], [:a1, 1], [:a2, 1]], [[:b3, 2], [:b1, 2], [:b2, 2]]]

zip 메소드를 어떤 객체에서 사용했는지에 따라 결과가 달라집니다.

zip 메소드를 사용한 객체의 길이가 인수로 전달하는 객체의 길이들보다 작다면 묶여 나오는 데이터에서 비게 되는 공간에 nil 이 들어가게 됩니다.

zip 메소드를 사용한 객체의 길이가 인수로 전달하는 객체의 길이들보다 크다면 zip 을 사용한 객체의 길이까지만 데이터를 묶어 반환합니다.

 

 

서로 다른 자료형 zip 메소드 사용 (Array와 Hash zip)

t1 = [:a, :b, :c, :d]
t2 = { a1: 1, b1: 2, c1: 3, d1: 4 }

p t1.zip(t2)  # [[:a, [:a1, 1]], [:b, [:b1, 2]], [:c, [:c1, 3]], [:d, [:d1, 4]]]

ArrayHash 서로 다른 자료형들 끼리도 zip 메소드를 사용할 수 있습니다.

 

zip 메소드 결과를 반환하지 않고 바로 사용하는 방법

t1 = [:a, :b, :c, :d]
t2 = [0, 1, 2, 3]

r1 = t1.zip(t2)
for k, v in r1 do
  p [k, v]
end
# Output
# [:a, 0]
# [:b, 1]
# [:c, 2]
# [:d, 3]


t1.zip(t2) { |k, v| p [k, v] }

# Output
# [:a, 0]
# [:b, 1]
# [:c, 2]
# [:d, 3]


r2 = t1.zip(t2) do |k, v|
  p [k, v]
end

# Output
# [:a, 0]
# [:b, 1]
# [:c, 2]
# [:d, 3]

p r2  # nil

zip(*other_enums) { |array| … } -> nil

방식으로 zip 메소드를 사용한 결과를 변수에 담아두지 않고 바로 사용해버리는 방식으로도 사용할 수 있습니다.

zip 메소드를 사용하면서 블록을 함께 사용하게 되면 반환하는 값은 nil이 되고,

블록에서 바로 묶인 데이터들을 사용할 수 있습니다.

 

이상으로 Ruby zip 메소드 사용 방법에 대한 설명을 마치도록 하겠습니다.

 

 

도움이 되셨다면 공감, 댓글 부탁드립니다!

궁금하신 점이나 요청사항은 언제든지 말씀해주세요!

피드백도 언제나 환영입니다!

 

감사합니다.


댓글