为什么是 string.join(list) 而不是 list.join(string)?

2022-09-05 00:48:06

这一直让我感到困惑。这似乎会更好:

["Hello", "world"].join("-")

比这:

"-".join(["Hello", "world"])

像这样有什么具体的原因吗?


答案 1

这是因为任何可迭代对象都可以连接(例如,list,元组,dict,set),但其内容和“joiner”必须是字符串。

例如:

'_'.join(['welcome', 'to', 'stack', 'overflow'])
'_'.join(('welcome', 'to', 'stack', 'overflow'))
'welcome_to_stack_overflow'

使用字符串以外的其他内容将引发以下错误:

类型错误:序列项 0:预期的 str 实例,找到 int


答案 2

这在 String 方法中进行了讨论...最后在Python-Dev achive中线程化,并被Guido接受。这个线程始于1999年6月,并被包含在2000年9月发布的Python 1.6中(并支持Unicode)。Python 2.0(包括支持的方法)于2000年10月发布。str.joinstrjoin

  • 此线程中提出了四个选项:
    • str.join(seq)
    • seq.join(str)
    • seq.reduce(str)
    • join作为内置函数
  • Guido 不仅希望支持 s 和 s,还希望支持所有序列/可迭代对象。listtuple
  • seq.reduce(str)对新人来说很难。
  • seq.join(str)引入了从序列到 str/unicode 的意外依赖关系。
  • join()因为内置函数将仅支持特定的数据类型。因此,使用内置命名空间并不好。如果支持许多数据类型,则创建优化的实现将很困难,如果使用该方法实现,那么它将是 。join()__add__O(n²)
  • 不应省略分隔符字符串 ()。显式比隐式更好。sep

以下是一些额外的想法(我自己和我朋友的):

  • Unicode支持即将到来,但它不是最终的。当时UTF-8是最有可能取代UCS2/4的。要计算 UTF-8 字符串的总缓冲区长度,它需要知道字符编码规则。
  • 当时,Python已经决定了一个通用的序列接口规则,用户可以在其中创建一个类似序列(可迭代)的类。但Python直到2.2才支持扩展内置类型。当时很难提供基本类(在另一条评论中提到过)。iterable

Guido的决定被记录在历史邮件中,决定:str.join(seq)

很有趣,但看起来确实是对的!巴里,去吧...
圭多·范·罗苏姆