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

新手上路,请多包涵

这一直让我感到困惑。看起来这样会更好:

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

比这个:

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

有这样的具体原因吗?

原文由 Evan Fosmark 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 576
2 个回答

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

例如:

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

 'welcome_to_stack_overflow'

使用字符串以外的东西会引发以下错误:

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

原文由 recursive 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

这里有一些额外的想法(我自己和我朋友的):

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

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

有趣,但它似乎是正确的!巴里,加油…

圭多·范·罗森

原文由 Yoshiki Shibukawa 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题