【问题标题】:Python string.join(list) on object array rather than string arrayPython string.join(list) 对象数组而不是字符串数组
【发布时间】:2010-10-04 14:36:49
【问题描述】:

在 Python 中,我可以做到:

>>> list = ['a', 'b', 'c']
>>> ', '.join(list)
'a, b, c'

当我有一个对象列表时,是否有任何简单的方法可以做到这一点?

>>> class Obj:
...     def __str__(self):
...         return 'name'
...
>>> list = [Obj(), Obj(), Obj()]
>>> ', '.join(list)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected string, instance found

还是我必须求助于 for 循环?

【问题讨论】:

    标签: python list


    【解决方案1】:

    您可以改用列表推导式或生成器表达式:

    ', '.join([str(x) for x in list])  # list comprehension
    ', '.join(str(x) for x in list)    # generator expression
    

    【讨论】:

    • 或生成器表达式:', '.join(str(x) for x in list)
    • 知道哪一个会更快吗?
    • 我的实验表明,列表理解在小列表上可以快 60%(实验在三个 object() 的列表上运行 10^6 次)。但是,它们在大列表上的性能相似(第二次实验在 10^7 个对象()列表上运行一次)。
    • 为了获得 30% 的良好加速(超过上面的生成器表达式),可以使用据说可读性较差的 map 表达式(下面)。
    • 这个答案客观上比map解决方案差。
    【解决方案2】:

    内置的字符串构造函数会自动调用obj.__str__:

    ''.join(map(str,list))
    

    【讨论】:

    • map() 不会改变列表,相当于[str(o) for o in list]
    • +1:地图是个好方法; “更改列表”不是一个准确的评论。
    • (another) +1.. map 可读性不差,只需要知道map函数是做什么的
    • @Michael 不正确。 reduce 是被删除的那个,因为它通常会让人们猜测,因此不是“pythonic”。另一方面,map 不是问题。
    • (another) +1:来自 Perl 世界,这是宇宙中最常见的东西:join("sep", list) - list 的所有元素都转换为它们的字符串表示形式。我一直在努力在 python 中找到解决方案。
    【解决方案3】:

    另一种解决方案是覆盖 str 类的连接运算符。

    让我们定义一个新的类 my_string 如下

    class my_string(str):
        def join(self, l):
            l_tmp = [str(x) for x in l]
            return super(my_string, self).join(l_tmp)
    

    那你就可以了

    class Obj:
        def __str__(self):
            return 'name'
    
    list = [Obj(), Obj(), Obj()]
    comma = my_string(',')
    
    print comma.join(list)
    

    你得到

    name,name,name
    

    顺便说一句,通过使用 list 作为变量名,您正在重新定义列表类(关键字)!最好使用另一个标识符名称。

    希望您会发现我的回答很有用。

    【讨论】:

      【解决方案4】:

      我知道这是一个超级老帖子,但我认为错过的是覆盖__repr__,所以__repr__ = __str__,这是这个question marked duplicate的公认答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-21
        • 1970-01-01
        • 2011-10-29
        • 2018-12-04
        • 2020-12-01
        • 2017-07-13
        相关资源
        最近更新 更多