【问题标题】:a list or tuple that is not iterable in python在 python 中不可迭代的列表或元组
【发布时间】:2018-05-26 10:07:25
【问题描述】:

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

其背后的原因是,有一些代码通过将多个结果添加到新列表然后调用“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 变量....它必须经过范围。

【问题讨论】:

  • 你能不能把它包装在一个单例元组中,所以它可以迭代它,它只有一个对象:return (wrapped,)
  • 我猜你可以从一个集合对象继承并重写一些方法,如果它们被调用就会崩溃。请发布输入/预期输出,因为目前尚不清楚。
  • @Max - 我添加了更多细节 - 我认为我正在按照你的建议做......它不起作用
  • @Jean-FrançoisFabre - 请再次查看我已更新代码
  • t1 = tuple([1,2,3]) 没有做你认为它做的事情:它将列表更改为一个元组。写 t1 = ([1,2,3],) 将其包装在一个元组中。

标签: python collections iterable


【解决方案1】:

您可以创建一个 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

【讨论】:

    【解决方案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)]
    

    【讨论】:

    • 必须使用extend
    【解决方案3】:

    您的问题不在于元组是可迭代的。使元组不可迭代将无济于事,因为使用不可迭代扩展列表根本不起作用。

    >>> 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)]
    >>> 
    

    【讨论】:

      猜你喜欢
      • 2011-10-06
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 2019-05-04
      • 1970-01-01
      • 2013-01-30
      相关资源
      最近更新 更多