在python中不可迭代的列表或元组

时间:2017-12-12 16:36:19

标签: python collections iterable

我正在寻找一个不可迭代的数据集合。

背后的原因是,有一些代码通过将它们添加到新列表然后调用“list.extend”函数来合并多个结果。

我尝试了元组,但它是可迭代的,我正在寻找一个不可迭代的内置集合。

它的作用:

>>> t1 = tuple([1,2,3])
... t2 = tuple([4,5,6])
... l = list()
... 
>>> l.extend(t1)
>>> l.extend(t2)
>>> 
>>> l
[1, 2, 3, 4, 5, 6]

我想要的是:

[(1,2,3), (4,5,6)]

请记住,我只能更改t1,t2变量....它必须通过范围。

3 个答案:

答案 0 :(得分:4)

你的问题不在于元组是可迭代的。使元组不可迭代不会有帮助,因为使用非迭代扩展列表根本不起作用。

>>> l = []
>>> l.extend(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>>> 

你需要做的是将你的元组包装在一个列表中:

>>> t1 = (1,2,3)
>>> t2 = (4,5,6)
>>> l.extend([t1])
>>> l.extend([t2])
>>> l
[(1, 2, 3), (4, 5, 6)]
>>> 

您还可以同时使用两个元组扩展列表:

>>> l.extend([t1,t2])
>>> l
[(1, 2, 3), (4, 5, 6), (1, 2, 3), (4, 5, 6)]
>>> 

答案 1 :(得分:2)

您可以使用列表的追加功能,例如: -

>>> t1 = tuple([1,2,3])
>>> t2 = tuple([4,5,6])
>>> l = list()
>>> l.append(t1)
>>> l.append(t2)
>>> l # [(1,2,3), (4,5,6)]

答案 2 :(得分:0)

你可以创建一个list的子类,其中extend__iadd__方法被覆盖,所以如果一个元组作为参数传递,它会附加而不是扩展:

class MyList(list):
    def __fake_extend(self,other):
        if isinstance(other,tuple):
            self.append(other)
        else:
            list.extend(self,other)

    def __iadd__(self,other):
        self.__fake_extend(other)
        return self
    def extend(self,other):
        self.__fake_extend(other)

t1 = (1,2,3)
t2 = (4,5,6)

l = MyList()

l.extend(t1)
l.extend(t2)
l.extend([4,2,4,5])
print(l)

结果:

[(1, 2, 3), (4, 5, 6), 4, 2, 4, 5]

附加了元组,列表中的项目也是如此(因为它们包含在不是tuple的列表中)