.join()方法到底是做什么的?

220

我对Python还不熟悉,完全被.join()搞糊涂了,我读到这是连接字符串的首选方法。

我尝试过:

strid = repr(595)
print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
    .tostring().join(strid)

然后得到了类似这样的东西:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5

为什么它会这样工作?595不应该自动追加吗?


1
我认为在程序运行时您触碰了您的Yubikey。 - Trenton
9个回答

316

仔细看一下你的输出:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5
^                 ^                 ^
我已经用粗体标出原始字符串中的“5”、“9”和“5”。Python的join()方法是一个字符串方法,需要一个要与字符串连接的列表。以下是一个更简单的例子来解释:
>>> ",".join(["a", "b", "c"])
'a,b,c'
在给定的列表中,每个元素之间都会插入“,”。在您的情况下,您的“列表”是字符串表示“595”,它被视为列表["5", "9", "5"]。 看起来你正在寻找+而不是逗号。
print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
.tostring() + strid

1
为什么不是: 5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5wlfgALGbXOahekxSs 将字符串附加到最后一个元素? - Matt McCormick
12
其中一个原因是这使得 join 拥有了有用的特性,即成为 split 的逆操作(http://docs.python.org/library/stdtypes.html#str.split)。 - cobbal
4
如果您想要另一个分隔符,请在列表末尾放置一个空字符串。 ','.join(['a', 'b', 'c', '']) 会得到 "a,b,c,"。 - tgray
9
OP可能混淆了string.joinos.path.join,后者确实是用于连接路径的。 - Juan Campa

96

join 接受一个可迭代的对象作为参数,通常是列表。在您的情况下问题出在字符串本身也是可迭代的,每次迭代输出每个字符。您的代码会变成这样:

"wlfgALGbXOahekxSs".join("595")

它的作用与这个相同:

"wlfgALGbXOahekxSs".join(["5", "9", "5"])

因此,生成了您的字符串:

"5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5"

在Python中,将字符串视为可迭代对象是最令初学者困惑的问题之一。


9
感谢指出可能是混淆的关键点而给予赞同:字符串可迭代,因此它们的表现类似于字符列表。 - Daniel Baird

61
要追加一个字符串,只需使用加号+来连接它。
例如:
>>> a = "Hello, "
>>> b = "world"
>>> str = a + b
>>> print str
Hello, world

join函数将字符串按照指定的分隔符连接在一起。该分隔符放置在join函数前面。例如:

>>> "-".join([a,b])
'Hello, -world'

Join接受一个字符串列表作为参数。


5
我们的社区应该提倡这种直接简洁的回答。@丹 - DehengYe

8

join()是用于将所有列表元素连接在一起的。如果只需要连接两个字符串,使用“+”更合适:

strid = repr(595)
print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
    .tostring() + strid

4

如果您想使用join方法简单地拼接两个字符串,可以像这样操作:

strid = repr(595)
print ''.join([array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
    .tostring(), strid])

2

在这里有一个很好的解释,为什么使用+来连接大量字符串是昂贵的

加号操作符是连接两个Python字符串的完美解决方案。但如果你要添加超过两个字符串(n > 25),你可能需要考虑其他方法。

''.join([a, b, c])技巧是一种性能优化。


0

当将此作为输入提供时,

li = ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
s = ";".join(li)
print(s)

Python 将此作为输出返回:

'server=mpilgrim;uid=sa;database=master;pwd=secret'

0

"".join 可以用于将列表中的字符串复制到变量中

>>> myList = list("Hello World")
>>> myString = "".join(myList)
>>> print(myList)
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> print(myString)
Hello World

0
list = ["my", "name", "is", "kourosh"]   
" ".join(list)

如果这是一个输入,我们可以使用JOIN方法添加单词之间的距离,并将列表转换为字符串。
这是Python输出。
'my name is kourosh'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接