我想迭代我的列表并使用多个元素执行某些操作,而不仅仅是一个元素。我想把第一个元素和一些元素放在它之后(它们可以是顺序的,也可以是返回的元素中的第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])
答案 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']]