以特定的间隔循环浏览多个列表

2024-04-26 07:33:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两张单子。一个是名字,另一个是数字,与第一个列表中的名字对应(对应的名字和数字在每个列表的同一索引点上)。我需要引用一个url中的每个名称和数字,该url一次只能处理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'

Tags: inpos名称url列表forsizegroup
3条回答

对你的第一个函数做一个相对较小的改动怎么样:

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)

发电机效率更高:

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可以给出任意数量的list作为参数。你知道吗

Itertools可以将迭代器(或生成器)分割成块,并使用一个小的helper函数继续执行,直到完成为止:

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

相关问题 更多 >