如何在Python中比较使用生成器的iterables?

2024-04-19 14:59:16 发布

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

我有以下问题。我必须实现一个作为生成器的函数,它需要任意数量的iterable。可以假设iterables每次都以相同的顺序发布它们的元素。函数应返回所有iterables(视图断言)中位于同一位置的所有元素:

def intersect(*iterables, **kwiterables):
    for obj in iterables:
        #need help here :)
        #already tried something like:
        # obj = (var for var in obj if var in iterables)
    yield obj

#asserts:
assert list(intersect((1,2,3))) == [1,2,3]
assert list(intersect((1,2,3), (1,"x",3))) == [1,3]
assert list(intersect([1,1,1,1,1,1,1,1,1], [1,2,1,2,1,2,1,2,1,2], k = [3,3,1,3,3,1,3,3,1,3,3,1])) == [1,1]

我很高兴能解释一下我的问题。你知道吗


Tags: 函数in视图obj元素for数量顺序
1条回答
网友
1楼 · 发布于 2024-04-19 14:59:16

可以使用^{}内置函数并行迭代所有iterables。你知道吗

例如,zip(it_a, it_b, it_c)迭代三元组(a, b, c),其中a来自it_ab来自it_bc来自it_c。第一个三元组包含iterables的第一个元素,第二个三元组包含第二个元素,依此类推。您可以将其与*语法结合起来,通过传递任意数量的参数来获得zip(*iterables),这将产生包含所有元素的n元组。(您可以进一步传递*iterables*kwiterables.values()来组合iterableskwiterables。)最后,一旦您得到值的“行”,您只需要检查该行的所有元素是否相等。你知道吗

最终结果如下(通过测试):

def intersect(*iterables, **kwiterables):
    for objs in zip(*iterables, *kwiterables.values()):
        first = objs[0]
        if all(o == first for o in objs[1:]):
            yield first

相关问题 更多 >