将列表转换为字符串的语义

时间:2013-04-30 13:41:17

标签: python list concatenation

许多编程语言(包括Python)都支持这样的操作:

", ".join(["1","2","3"])

返回字符串

"1, 2, 3"

我理解是这种情况,但我不理解它背后的设计决策 - 当然在列表上执行join操作在语义上更有效,如下所示:

["1","2","3"].join(", ")

如果有人能解释设计决定并对其有所了解,我会很感激。

编辑:看起来Javascript在列表中有join方法;如果有人有特定语言遵循的惯例,请随时评论/回答有关该特定语言的选择。

1 个答案:

答案 0 :(得分:3)

对于python,有一些反对它的论据。首先,如果它是一个接受任意迭代的字符串方法,那么你只需要在字符串对象上支持join方法,它就可以自动使用任何可迭代的方法。否则,自定义可迭代对象也需要支持join方法等等。

考虑:

", ".join(["1","2","3"])
", ".join(("1","2","3"))
", ".join(str(x) for x in xrange(1,4))
", ".join({'1':None,'2':None,'3':None})
", ".join({'1','2','3'})  #set literal syntax -- python2.7+
", ".join("123")

只有一种方法支持6种不同的类型(我只触及了内置类型)。

其次,如果列表中的所有内容都是join类型,则您只能basestring列表。在列表上提供一个方法似乎很愚蠢,如果你在一个包含错误内容的列表中使用它会引发异常 - 至少,这里的API似乎有点棘手(对我而言)。当然,你可以争辩说list.remove如果用错误的参数调用会引发异常。这是真的 - 但总的来说,你只是删除一个项目。它的运行水平低于join应该的水平。当然,这个论点比我提出的第一个论点要弱,所以如果你不喜欢它,那就回到论点1.