【问题标题】:Pythonic approach to zipping items in a list [duplicate]Pythonic方法在列表中压缩项目[重复]
【发布时间】:2012-11-27 00:24:10
【问题描述】:

可能重复:
Python: Looping through all but the last item of a list

假设我想遍历一个列表。每次我迭代时,我都想使用当前项和下一项来计算一些东西。我可以做类似的事情

mylist = [1, 2, 3, 4]
for i in range(len(mylist)):
    try:
        compute(mylist[i], mylist[i+1])
    except IndexError:
        compute(mylist[i])

我也可以

mylist = [1, 2, 3, 4]
for num in mylist:
    try:
        compute(num, mylist[mylist.index(num)+1])
    except IndexError:
        compute(num)

这些似乎都不是特别好。有没有更 Pythonic 的方法来做到这一点?

【问题讨论】:

  • 您可以尝试使用itertools documentation 中的pairwise 配方。
  • @Wessie:这正是他应该做的......你应该把它变成一个答案。
  • 为什么在最后一次迭代中调用compute 时只有一个参数?

标签: python


【解决方案1】:

有三种方法可以做到这一点(尽管我可能更喜欢第一种,除非你的条件不同):

  1. 使用itertools.izip() - 这将是高效和Pythonic:

    for item1, item2 in itertools.izip(my_list, my_list[1:]):
        # do something...
    
  2. 使用enumerate():

    for index, item in enumerate(my_list):
        # do something...
    
  3. 将前一行存储在一个变量中(该示例假设您的列表中没有None):

    previous = None
    for item in my_list:
        if previous is None:
            previous = item
            continue
        # do something...
    

【讨论】:

  • +1 选项 1 可能是最好的恕我直言。
【解决方案2】:

您可以使用内置函数enumerate

mylist = [1, 2, 3, 4]
for i, num in enumerate(mylist):
    try:
        compute(num, mylist[i+1])
    except IndexError:
        compute(num)

但是在您的两个实现之间进行选择相当容易 - 第二个不仅慢得多 (O(n^2)),而且对于重复元素也有奇怪的语义。

【讨论】:

  • 这看起来不错;感谢您的快速反馈!
【解决方案3】:

要在最后涵盖您的特殊情况,您需要:

for t in zip(mylist, mylist[1:]) + [(mylist[-1],)]
    compute(*t)

【讨论】:

    【解决方案4】:

    不使用 itertools 的函数式样式可能类似于:

    for t in zip(mylist, mylist[1:]):
        compute(*t)
    

    如果性能无异,您可以使用itertools.izip 阻止在压缩期间创建中间列表。

    要涵盖问题中所示的特殊情况,请使用:

    for t in zip(mylist, mylist[1:]) + [(mylist[-1],)]
        compute(*t)
    

    【讨论】:

    • 为什么效率低?
    • 实际上并没有那么糟糕,但是 zip 创建了一个不必要的中间列表。最好使用itertools.izip
    猜你喜欢
    • 2014-06-13
    • 2017-05-04
    • 2017-05-01
    • 2020-01-13
    • 1970-01-01
    • 2017-05-09
    • 2017-09-12
    • 2011-09-15
    • 2013-03-24
    相关资源
    最近更新 更多