Python,如何返回与输入相同类型的结果

时间:2019-01-02 12:31:54

标签: python python-3.x function types

我想创建一个函数,该函数可以展平可迭代对象的所有可能的组合,并以与输入相同的类型返回结果。

到目前为止,我创建了以下函数。但是它不能像我想要的那样工作。例如:

  

flatten_iterable(([[1,2,3],{4,5,6},(7,8,9)))

给出以下结果:

  

(1、2、3,{4、5、6},7、8、9)

如您所见,集合仍然存在

当输入是集合时,出现以下错误:

  

TypeError:不可散列的类型:“列表”

def flatten_iterable(something):
    new_list = []
    x = type(something)
    if isinstance(something, (list, tuple)):
        for a in something:
            new_list.extend(flatten_list(a))
    else:
        new_list.append(a_list)
    new_list2 = x(new_list)
    return new_list2

有人知道如何解决此问题吗?

2 个答案:

答案 0 :(得分:3)

尝试

def flatten_iterable(input_):
    for item in input_:
        if hasattr(item,'__iter__') and not isinstance(item, (str, bytes)):
            yield from flatten_iterable(item)
        else:
            yield item

答案 1 :(得分:1)

isinstance(something, (list, tuple))对于集合显然是错误的,这就是为什么要将整个集合添加到结果中的原因。更好的方法是检查hasattr(something, '__iter__')(注意,它也会“拉平”字符串)。我更喜欢@ mehrdad-pedramfar的答案