用于在列表中压缩项目的Pythonic方法

时间:2012-11-27 00:24:10

标签: python

  

可能重复:
  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方法吗?

4 个答案:

答案 0 :(得分:1)

您可以使用内置函数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)),而且对重复元素也有奇怪的语义。

答案 1 :(得分: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...
    

答案 2 :(得分:0)

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

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

如果性能相当于您可以使用itertools.izip阻止在zip期间创建intermeida列表。

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

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

答案 3 :(得分:0)

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

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