【问题标题】:convert lists to tuples converting also the lists inside the list将列表转换为元组也转换列表中的列表
【发布时间】:2012-11-02 06:25:31
【问题描述】:

在 Python 中将列表转换为元组的一种简单方法是:

tuple1=tuple(list1)

但如果 list1 包含一个或多个列表,它们保持不变。有没有办法我们也可以转换它们? 例如

list1=[1,3,'abc',[3,4,5]]

前往:

tuple1=(1,3,'abc',(3,4,5))

【问题讨论】:

    标签: python list type-conversion tuples


    【解决方案1】:

    这里只需要递归:

    def convert(l):
        return tuple(convert(x) for x in l) if type(l) is list else l
    
    >>> convert([1,3,'abc',[3,4,5]])
    (1, 3, 'abc', (3, 4, 5))
    >>> convert([[[[[[]]]]]])
    ((((((),),),),),)
    >>> convert(42)
    42
    

    【讨论】:

    • 出色地使用了递归。它适用于任何级别的嵌套(低于递归限制 - 不是真正的问题)。
    • 我认为isinstance(l,list) 是首选。
    • @mgilson:不确定。已编辑。我认为在这种情况下,您可能不想将列表派生类转换为元组。
    • 如果是这种情况,我建议使用type(x) is list 更清楚地表明您正在处理列表和列表。
    • @Eric -- 是的,我认为是的(只要在 python 中进行非常具体的类型检查是合适的;-)。 is 表示它们是同一个对象。 == 只是意味着它们在某种意义上是等价的(由__eq__ 定义)。在这种情况下,is 和 == 做同样的事情,前者更明确(在我看来)。
    【解决方案2】:

    使用isinstance() 来查看一个元素是否是一个列表:

    In [64]: lis=[1,3,'abc',[3,4,5]]
    
    In [66]: tuple(tuple(x) if isinstance(x,list) else x for x in lis)
    Out[66]: (1, 3, 'abc', (3, 4, 5))
    

    【讨论】:

    • list 有内置超类吗?
    • 不,不是,但type() 可能不适用于list 的子类。
    • @Eric:超类? abc.types.ListType。子类,我不知道。
    猜你喜欢
    • 2012-06-05
    • 1970-01-01
    • 2016-09-28
    • 2018-12-19
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    相关资源
    最近更新 更多