【问题标题】:Python: intersect of Iterables, which index-values are equal [closed]Python:Iterables的交集,索引值相等[关闭]
【发布时间】:2018-11-29 08:30:33
【问题描述】:

我需要一个期望任意数量的可迭代的函数。为此,您可以假设这些可迭代对象以相同的顺序输出其元素。

我想要一个函数,它返回一个元素列表,它们位于输入迭代的相同位置(相同索引), 例如。对于 [1,2,3] 和 [1, "x", 3],将返回 1 和 3。 示例:相交((1,2,3),(1,2,3),(1,2,3),(1,2,3),(1,2,3),(1,2,3 )) 将返回 [1,2,3]

我试过了,但我认为它完全错误:C

def intersect(*args):
"""Docstring"""
ausgabe = []
anzahlderlisten = len(args)
count = 1
if(anzahlderlisten == 1):
    return args[0]
if(anzahlderlisten == 0):
    return []

längsteliste = args[0]
while count < anzahlderlisten:
    for i in längsteliste:
        if not i in args[count] and längsteliste.index(i) == args[count].index(i):
            print("db")
            if not(i in ausgabe):
                print("db")
                ausgabe.append(i)
        count = count + 1
    return ausgabe

【问题讨论】:

  • 我不知道这里的问题是什么,也没有尝试,也没有想要的输出,也没有当前的输出。
  • 现在你添加了一些代码——这很好——但你认为它不好。是什么特别让您有这种想法?
  • 因为它不起作用......它很复杂

标签: python function methods generator yield


【解决方案1】:

一种可能性如下:

def all_same(items):       
    return all(item == items[0] for item in items[1:])

def get_agreeing(*iterables):
    assert len(iterables) >= 2
    return (row[0] for row in zip(*iterables) if all_same(row))


print(tuple(get_agreeing(range(3), range(1, 4), range(3))))
print(tuple(get_agreeing(range(3), (0, 4, 2), (1, 0, 2))))

get_agreeing 使用可变参数,这意味着获取任意数量的参数,将它们放入一个可迭代对象中,然后将其传递给函数。这是由 * 语法完成的。

然后我们再次使用星号将这些参数传递给 zip 函数,其方式与传递给 get_agreeing 的方式相同 因此,如果您将可迭代对象视为列向量,您可以将所有第一个元素视为一行。对于这一行,您只需要检查所有元素是否相同,如果相同,则生成器将返回其中的第一个元素。

如果您想了解有关可变参数或生成器的更多信息,请参阅:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2011-07-02
    • 2014-08-21
    • 2014-03-23
    • 1970-01-01
    相关资源
    最近更新 更多