Pythonic循环——如何在遍历列表时获取多个元素

5 投票
7 回答
17254 浏览
提问于 2025-04-16 13:37

我想遍历我的列表,并对多个元素进行操作,而不仅仅是一个元素。我想拿第一个元素和它后面的几个元素(这些元素可以是连续的,或者可能是返回的那个元素的第三个元素)。

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')

我想,使用enumerate是处理这个问题的最好方法?

遍历列表是如此简单而优雅,我希望类似的语法能让你在for循环中直接使用元素,而不需要使用range或enumerate。

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 个回答

4

你可以使用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:]),因为*号可以把一个列表拆分成多个单独的参数,方便函数调用。

4

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

l = range(10)

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

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

或者,如果你想跳得更远一些,可以使用step:

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

(0, 2)
(3, 5)
(6, 8)
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']

我知道这不是很符合Python的风格,但它确实能正常工作。

撰写回答