我想创建一个函数,该函数可以展平可迭代对象的所有可能的组合,并以与输入相同的类型返回结果。
到目前为止,我创建了以下函数。但是它不能像我想要的那样工作。例如:
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
有人知道如何解决此问题吗?
答案 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的答案