以特定间隔循环遍历多个列表

时间:2018-03-27 18:19:38

标签: python python-3.x list loops dictionary

我有两个清单。一个具有名称,一个具有与第一个列表中的名称对应的数字(对应的名称和编号位于每个列表中的相同索引点)。我需要在一个只能处理25个不同名称的网址中引用每个姓名和号码。一次一点。

pointNames = ['name1', 'name2', 'name3']
points = ['1', '2', '3']  #yes, the numbers are meant to be strings

我的实际列表每个大约有600个值。我尝试做的是同时遍历每个列表,但是以25为增量。我可以使用以下单个列表执行此操作:

def chunker(seq, size):
    return (seq[pos:pos + size] for pos in range(0, len(seq), size))

for group in chunker(pointNames, 25):
    print (group)

这将从列表中打印多个25个值的组,直到它遍历整个列表。我想做到这一点,但有两个列表。我可以使用for(point, name) in zip(points, pointNames):完全打印每个列表,但我需要以25个为一组进行打印。

我还尝试将这两个列表合并到字典中:

dictionary = dict(zip(points, pointNames))

for group in chunker(dictionary, 25):
    print (group)

但是我收到以下错误:

TypeError: unhashable type: 'slice'

3 个答案:

答案 0 :(得分:2)

对你的第一个功能这个相对最小的改变怎么样:

def chunker(seq1, seq2, size):
    seq = list(zip(seq1, seq2))
    return (seq[pos:pos + size] for pos in range(0, len(seq), size))

请致电如下:

for group in chunker(pointNames, points, 25):
    print(group)

答案 1 :(得分:2)

发电机效率更高:

import itertools

def chunker(size, *seq):
    seq = zip(*seq)
    while True:
        val = list(itertools.islice(seq, size))
        if not val:
            break
        yield val


for group in chunker(2, pointNames, points):
    print(group)

gen_groups = chunker(2, pointNames, points, pointNames, points)
group = next(gen_groups)
print(group)

使用*seq可以将任意数量的列表作为参数。

答案 2 :(得分:2)

Itertools可以将迭代器(或生成器)切成块,并附带一个小辅助函数,以便一直运行直到完成:

import itertools

# helper function, https://stackoverflow.com/a/24527424
def chunks(iterable, size=10):
    iterator = iter(iterable)
    for first in iterator:
        yield itertools.chain([first], itertools.islice(iterator, size - 1))


# 600 points and pointNames
points = (str(i) for i in range(600))
pointNames = ('name ' + str(i) for i in range(600))

# work with the chunks
for chunk in chunks(zip(pointNames, points), 25):
    print('-' * 40)
    print(list(chunk))