【问题标题】:Create (L[i], L[i+1]) tuple list from list L [duplicate]从列表 L [重复] 创建 (L[i], L[i+1]) 元组列表
【发布时间】:2014-05-25 05:53:11
【问题描述】:

假设我们有一个列表L = [1,2,3,4,5]。有没有一种干净的方法来制作以下形式的元组列表:T = [(1,2),(2,3),(3,4),(4,5)]

如果有更好的替代品就好了

    T = []
    for i in range(len(L) - 1):
        T.append((L[i], L[i+1]))

或等价的理解。

【问题讨论】:

    标签: python


    【解决方案1】:

    你可以使用内置的zip函数:zip(L, L[1:])

    In [4]: L = [1,2,3,4,5]
    
    In [5]: zip(L, L[1:])
    Out[5]: [(1, 2), (2, 3), (3, 4), (4, 5)]
    

    【讨论】:

    • 正是我想要的。谢谢!
    • 有史以来最快的......真棒......
    【解决方案2】:

    尝试:

    list(zip(l[:-1], l[1:]))
    

    应该这样做。

    注意

    list(zip(l, l[1:]))
    

    也可以,因为 zip 会剪掉最长的人,但它不那么明确。

    【讨论】:

    • 我发现第二个更清晰,并且永远不会考虑编写第一个,即使它是等效的。问题提到“T = [(1,2),(2,3),(3,4),(4,5)]”,我的肉眼检查显示每个元组的第一个元素是 l;第二个来自 l[1:]。
    • 好吧,总有两种方法可以查看它,如果您不熟悉 zip 功能,我认为第一种更清楚,因为第一列中缺少最后一个元素。您需要了解 zip 的切割(也有 zip_longest)
    • 哦,我知道 zip。 (我在其中一个方面写了这篇博文:paddy3118.blogspot.co.uk/2007/02/unzip-un-needed-in-python.html)。我只是想知道描述的哪些方面让您认为您的第一个答案更好。您解释说这是由于考虑了最后一个要素。同样有效。我想这是一个花瓶还是两个面相望的例子:en.wikipedia.org/wiki/Rubin_vase
    【解决方案3】:

    使用列表理解的幼稚方法,这也可以,但我不确定使用 zip 是否更快。

    L = [1,2,3,4,5]
    [(L[i], L[i+1]) for i in range(len(L) - 1)]
    

    【讨论】:

      【解决方案4】:
      In [15]: L = [1,2,3,4,5]
      In [16]: oL = [(x, y) for x, y in zip(L, L[1:])]
      In [17]: oL
      Out[17]: [(1, 2), (2, 3), (3, 4), (4, 5)]
      

      或者干脆

      oL = zip(L, L[1:])
      

      【讨论】:

        猜你喜欢
        • 2017-09-19
        • 2012-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-14
        • 2019-12-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多