代码之家  ›  专栏  ›  技术社区  ›  Mason Wheeler

如何处理zip算法的不匹配列表

  •  2
  • Mason Wheeler  · 技术社区  · 15 年前

    我正在考虑编写函数zip例程的Delphi实现,它包含两个列表并输出一组元素对。因此,给它喂食[1,2,3]和['a'、'b'、'c']会得到[(1,'a')、(2,'b')、(3,'c')]。如果两个输入的长度完全相同,就像我在网上看到的每个演示中一样,那就太好了。但如果第一个是[1,2,3,4]呢?输出应该是什么?这个案例是如何在其他语言的其他实现中处理的?

    3 回复  |  直到 15 年前
        1
  •  10
  •   Juliet    15 年前

    这样做没有“对”或“错”的方法,具体的实现细节由您决定。您可以采取以下几种方法:

    1)F方法:抛出异常。

    2)haskell和python方法:将输出截断为输入的最小长度。

    zip [1; 2; 3] ['a'; 'b'; 'c'; 'd'; 'e']
      = [ (1, 'a'); (2, 'b'); (3, 'c')]
    

    有时截断会很有用,就像通常压缩有限和无限序列时那样。

    3)Ruby方法:零或零输出不可用值:

    zip [1; 2; 3] ['a'; 'b'; 'c'; 'd'; 'e']
      = [ (1, 'a'); (2, 'b'); (3, 'c'); (nil, 'd'); (nil, 'e')]
    

    4)根据需要缩短元组2-和1-元组:

    zip [1; 2; 3] ['a'; 'b'; 'c'; 'd'; 'e']
      = [ (1, 'a'); (2, 'b'); (3, 'c'); ('d'); ('e')]
    

    我不懂任何能做到这一点的语言。

        2
  •  2
  •   Apocalisp    15 年前

    一个常见的做法是用自己的尾部压缩一个列表。例如,将点列表转换为访问这些点的路径。尾部明显比列表短,但这肯定不是一个例外。另一个常见的事情是压缩一个包含所有尾部的列表,以获得可以从列表中构造的无序对的列表(要构造一个完整的图,例如:

    liftM2 (=<<) zip tails
    

    如果 zip 引发异常或返回空值。因此,预期的行为是将输出截断为较短列表的长度。这与函数的类型一致。

        3
  •  1
  •   Steve    15 年前

    python截断到最小序列的长度。这对我很有用。