当前位置: 首页 > 知识库问答 >
问题:

迭代两个长度不同的向量

安泰平
2023-03-14

我有两个长度不同的< code>Vec,例如:

let xs = vec![1, 2, 3, 4, 5];
let ys = vec![11, 12, 13];

我想成对迭代它们,打印:

x=1, y=11
x=2, y=12
x=3, y=13
x=4; no matching Y
x=5; no matching Y

我可以使用< code>Iterator::zip来获得在< code>xs和< code>ys中具有匹配元素的对:

for (x, y) in xs.iter().zip(ys.iter()) {
    println!("x={}, y={}", x, y);
}

但是对于“不匹配”位,我需要复杂的代码来检查长度并从其余部分中提取一部分。

我想要一个完全基于迭代器的解决方案,所以我尝试了:

let mut it_xs = xs.iter();
let mut it_ys = ys.iter();
while let (Some(x), Some(y)) = (it_xs.next(), it_ys.next()) {
    println!("x={}, y={}", x, y);
}
while let Some(x) = it_xs.next() {
    println!("x={}, no matching Y", x);
}
while let Some(y) = it_ys.next() {
    println!("y={}, no matching X", y);
}

这是不正确的,因为第一个循环跳过了在另一个列表中没有匹配的第一个元素(x=4)。

是否有可能在迭代器的帮助下解决,而无需切分更大的Vec的其余部分?

共有2个答案

田佐
2023-03-14

itertools有一个方法zip_longest可以做到这一点:

use itertools::Itertools;
use itertools::EitherOrBoth::{Both, Left, Right};

for it in xs.iter().zip_longest(ys.iter()) {
    match it {
        Both(x, y) => println!("x={}, y={}", x, y),
        Left(x) => println!("x={}, no matching Y", x),
        Right(y) => println!("y={}, no matching X", y),
    }
}
狄玉书
2023-03-14

无需外部板条箱的实现:

let mut it_xs = xs.iter();
let mut it_ys = ys.iter();
loop {
    match (it_xs.next(), it_ys.next()) {
        (Some(x), Some(y)) => println!("x={}, y={}", x, y),
        (Some(x), None) => println!("x={}, no matching Y", x),  
        (None, Some(y)) => println!("y={}, no matching X", y), 
        (None, None) => break,
    }
}
 类似资料:
  • 我有一个Firebase数据库,在一个特定的节点级别上有日期,每个日期都有键值对,其值为一定的数字。现在我需要找到最近两天常见的数字。

  • 我的情况是这样的:我有两个带有不同类型对象的arraylists。每个对象都有一个字段名和一个字段日期ArrayList事件、ArrayList事物。我按名称对arraylists进行排序,如果名称相同,则按日期进行排序。 假设ArrayList1具有以下对象:event1 01.12、event1 05.12、event2 04.03、event3 05.05 我如何迭代两个arraylists

  • 我从一个布局数组中拼接了一个位图,它将一个更大的位图作为指导。在一个位图中使用多个位图。我旋转整个位图时,我的解决方案是重新绘制它,但要让数组考虑这个旋转。位图的制作由数组的顺序决定。缝合假定数组从零开始,即第一个索引或最左上角,然后向右到最后,再到下一行的开始。我想有一个90、180、270和360功能可以调用。我想360很容易,我倒着迭代。我用的是11乘11,这是常数。 例如 当我旋转90度

  • 我有两个不同长度的数据帧。我想用CAP*货币和Go*货币与df_cur的乘法来改变数据帧df中的列。这应该在国家和年份必须分别对两个数据家族相同的条件下完成。更具体地说, #df# #df_cur# 所以,我想像这样变换df: #df# 我回顾了许多将两个数据帧大小不同的列相乘得到的答案,但没有任何结果。 我的代码示例: 非常感谢您的宝贵时间!

  • 问题内容: 如何堆叠x可以是任何数字的形状的按列向量? 例如, 工作正常,但沿着错误的尺寸连接。 问题答案: 简短答案:您不能。NumPy本机不支持锯齿数组。 长答案: 给出一个 可能或可能不 符合您预期的数组。例如,它不支持诸如或之类的基本方法,因此您应该像对待普通的Python列表那样对待它(对它进行迭代以执行操作而不是使用向量化的惯用法)。 存在几种可能的解决方法。最简单的是强迫和以共同的长