Метод unzip
Метод unzip преобразует итератор,
состоящий из пар элементов, в пару коллекций.
Он принимает итератор, элементами которого являются
кортежи из двух значений, и возвращает кортеж
из двух векторов: первый содержит все первые
элементы пар, второй - все вторые элементы.
Метод не принимает параметров и потребляет
исходный итератор.
Синтаксис
iter.unzip()
Пример
Давайте разделим итератор пар чисел на два вектора:
fn main()
{
let pairs = vec![(1, 2), (3, 4), (5, 6)];
let (left, right): (Vec<i32>, Vec<i32>) = pairs.into_iter().unzip();
println!("{:?}", left);
println!("{:?}", right);
}
Результат выполнения кода:
[1, 3, 5]
[2, 4, 6]
Пример
Давайте разделим итератор пар строк на два вектора:
fn main()
{
let pairs = vec![("a", "b"), ("c", "d"), ("e", "f")];
let (left, right): (Vec<&str>, Vec<&str>) = pairs.into_iter().unzip();
println!("{:?}", left);
println!("{:?}", right);
}
Результат выполнения кода:
["a", "c", "e"]
["b", "d", "f"]
Пример
Давайте применим unzip к результату метода zip,
чтобы убедиться в обратимости операции:
fn main()
{
let left = vec![1, 2, 3];
let right = vec![4, 5, 6];
let pairs: Vec<(i32, i32)> = left.iter().cloned().zip(right.iter().cloned()).collect();
let (left2, right2): (Vec<i32>, Vec<i32>) = pairs.into_iter().unzip();
println!("{:?}", left2);
println!("{:?}", right2);
}
Результат выполнения кода:
[1, 2, 3]
[4, 5, 6]