按一定数量迭代列表

时间:2014-03-13 23:47:46

标签: python list

假设我有以下列表:

['id-1213fsr53', 'WAITING', '54-81-24-40', 'world', 'id-343252sfsg', 'WAITING', '54-41-06-143', 'hello']

列表可以按以下格式细分为元组:

(id, status, ip-address, name)

所以,在另一个检查状态,我需要通过这4个元素元组迭代该列表, 像:

for s in status:
   (id, status, ip-address, name) = s # (s is a 4 element list)
   # increment s by 4, and continue the loop

如何在python中实现此类行为?

3 个答案:

答案 0 :(得分:5)

最简单的方法是使用grouper itertools recipe

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

你可以使用它:

for s in grouper(status, 4):

请注意,如果使用status解压缩其中一个元组值和原始数据,则会出现问题。

答案 1 :(得分:1)

使用从zip()文档分组元素的方法:

data = ['id-1213fsr53', 'WAITING', '54-81-24-40', 'world', 'id-343252sfsg', 'WAITING', '54-41-06-143', 'hello']
for s in zip(*[iter(data)]*4):
    (id, status, ip_address, name) = s

您还可以在迭代中执行解包:

for id, status, ip_address, name in zip(*[iter(data)]*4):
    # do something

以下是zip()调用正在执行的允许此类迭代的内容:

>>> zip(*[iter(data)]*4)
[('id-1213fsr53', 'WAITING', '54-81-24-40', 'world'), ('id-343252sfsg', 'WAITING', '54-41-06-143', 'hello')]

答案 2 :(得分:0)

试试这个:

for index in range(0, len(status), 4):
    (id,status,ip-address,name) = s[index:index+4]