Pythonic循环 - 如何在迭代列表时获取多个元素

时间:2011-03-13 20:38:33

标签: python

我想迭代我的列表并使用多个元素执行某些操作,而不仅仅是一个元素。我想把第一个元素和一些元素放在它之后(它们可以是顺序的,也可以是返回的元素中的第3个元素)。

l = ['a', 'b', 'c', 'd', 'e']
  for items in l:
    print items[:3]

输出应为:

['a', 'b', 'c'], ['b', 'c', 'd'], ['c', 'd', 'e']

有很多好的答案,如果想跳过元素怎么办? 比如说,获取一个元素,跳过下一个元素,并获得第三个元素?

输出:

('a', 'c'), ('b','d'), ('c', 'e')

我猜枚举是解决这个问题的最佳方法吗?

迭代列表如此简单和优雅我希望类似的语法允许你在元素本身的for循环中使用它而不使用范围或枚举。

l = ['a', 'b', 'c', 'd', 'e']
  for items in l:
    print (items[0], items[2])

(是的,我知道如果原始列表是包含列表的列表,此代码会给出不同的结果。[[1,2,3],[4,5,6],[7,8,9]]返回[1,3],[4,6],[7,9])

7 个答案:

答案 0 :(得分:3)

l = ['a', 'b', 'c', 'd', 'e']
subarraysize = 3
for i in range(len(l)-subarraysize+1):
    print l[i:i+subarraysize]

输出:

['a', 'b', 'c']
['b', 'c', 'd']
['c', 'd', 'e']

我知道并不是非常恐怖,但对它有利,它确实有用。

答案 1 :(得分:2)

您可以使用zip和切片:

l = range(5)
for grp in zip(*[l[i:] for i in range(3)]):
    print grp 

(0, 1, 2)
(1, 2, 3)
(2, 3, 4)

编辑正常工作,并将组长度作为一个数字。 :)

这样做是调用zip(l[0:], l[1:], l[2:]),因为*将列表转换为函数调用的单独参数。

答案 2 :(得分:2)

我可能建议的一个改进是修改David Heffernan的建议,使其更加pythonic,即。

l = ['a', 'b', 'c', 'd', 'e']
n = 3
m = [l[i:i+n] for i in range(len(l)-n+1)]

输出:

m = [['a', 'b', 'c'], ['b', 'c', 'd'], ['c', 'd', 'e']]

答案 3 :(得分:2)

如果你想要第一个和第三个子序列元素,使用zip可能是最简单的方法:

l = range(10)

for grp in zip(l[0:], l[2:]):
   print grp

(0, 2)
(1, 3)
(2, 4)
...

或者,如果您想进一步跳跃,请使用步骤:

for grp in zip(l[0::3], l[2::3]):
   print grp 

(0, 2)
(3, 5)
(6, 8)

答案 4 :(得分:2)

l = ['a', 'b', 'c', 'd', 'e'] 

>>> zip(l,l[1:],l[2:])

[('a', 'b', 'c'), ('b', 'c', 'd'), ('c', 'd', 'e')]

>>> l = [chr(x+65) for x in xrange(26)]

>>> zip(l,l[1:],l[2:])

[('A', 'B', 'C'), ('B', 'C', 'D'), ('C', 'D', 'E'), ('D', 'E', 'F'), ('E', 'F', 'G'), ('F', 'G', 'H'), ('G', 'H', 'I'), 
 ('H', 'I', 'J'), ('I', 'J', 'K'), ('J', 'K', 'L'), ('K', 'L', 'M'), ('L', 'M', 'N'), ('M', 'N', 'O'), ('N', 'O', 'P'),
 ('O', 'P', 'Q'), ('P', 'Q', 'R'), ('Q', 'R', 'S'), ('R', 'S', 'T'), ('S', 'T', 'U'), ('T', 'U', 'V'), ('U', 'V', 'W'), 
 ('V', 'W', 'X'), ('W', 'X', 'Y'), ('X', 'Y', 'Z')]

答案 5 :(得分:0)

另一个版本(类似于David的)是在生成器表达式中使用切片:

size = 3
for grp in (l[i:i+size] for i in range(len(l)-size+1)):
    print grp

[0, 1, 2]
[1, 2, 3]
[2, 3, 4]

如果重要的话,这个版本会产生列表而不是元组。

答案 6 :(得分:0)

这是我的解决方案,以避免在评论中使用OP所要求的range

>>> items = ['a', 'b', 'c', 'd', 'e']
>>> n = 3
>>> [item for item in map(lambda x: items[items.index(x):items.index(x) + n], it
ems) if len(item) == n]
[['a', 'b', 'c'], ['b', 'c', 'd'], ['c', 'd', 'e']]