{ }codelper

学习 › Python

数据 · 12

拼接构建字符串

一段一段拼出字符串、用分隔符连接、在一行里连着输出。

要输出的字符串没法一次写出来时,就一段一段地拼出来。
下面的例子读入几个单词,依次输出由首字母组成的字符串、用逗号连接的单词,以及用空格隔开的各单词长度。

words = input().split()initials = ""for w in words:    initials += w[0]         # 한 조각씩 붙여 가요print(initials)print(", ".join(words))      # 사이에만 ", "lens = [len(w) for w in words]print(*lens)                 # 빈칸으로 이어 찍기
stdin
red green blue
stdout
rgb
red, green, blue
3 5 4

要点

  • 拼接构建:从空字符串开始,在循环中把片段接到后面(initials += w[0])。
    这和用 total += x 累加求和是同一种写法。
  • Java 和 C# 的 += 每次都会把到目前为止的字符串整个重新做一份。
    所以它们另有 StringBuilder:先把片段攒起来,最后只转成一次字符串。
  • 接上一个数时,有的语言会自动把它变成字符串,有的语言要自己先转换。
  • 连接(join)只在列表各个值之间放入分隔字符串,合成一个字符串。
    把 red、green、blue 用 ", " 连接就是 red, green, blue。
    末尾不会多出分隔符。
  • 没有连接功能的语言用循环来写。
    只有不是第一个值时才先输出分隔符,再输出值,末尾就不会留下分隔符。
  • 把几个数输出在一行也是同一件事。
    有的语言有一次输出完的简短写法,有的语言要用不换行的输出一个一个地输出。

各语言的写法

Python拼接用 s += 片段 — 数要先用 str(n) 转换。
片段很多时,先 append 到列表里,最后 "".join(parts)。
", ".join(words) 只接受字符串列表。
一行输出用 print(*nums),要换分隔符用 print(*nums, sep=", ")
JavaScript拼接用 s += 片段 — 数会自动变成字符串。
words.join(", ") 对数字数组也可以用,括号里什么都不写的 join() 用逗号连接。
一行输出用 console.log(nums.join(" "))
TypeScript和 JavaScript 一样
Java先 StringBuilder sb = new StringBuilder();,再 sb.append(片段) — 字符、数、字符串都接受。
最后用 sb.toString() 转换,或者直接 println(sb)。
String.join(", ", words) 只接受字符串。
数可以用 System.out.print 一个一个输出,或者攒到 StringBuilder 里
C#先 var sb = new StringBuilder();(using System.Text;),再 sb.Append(片段),最后 sb.ToString()。
string.Join(", ", words) 也接受数字数组,所以一行输出是 Console.WriteLine(string.Join(" ", nums))
C++std::string 可以修改,所以 s += 片段 是原地追加。
数要先用 std::to_string(n) 转换。
没有连接功能,要用循环写成 if (i > 0) std::cout << ", ";。
也可以用 << 攒到 std::ostringstream 里,再用 .str() 取出
C字符串是 char 数组:留够空间,一格一格放入字符,最后放上 '\0'。
追加字符串用 strcat(buf, "cd"),追加数用 sprintf(buf + len, "%d", n)。
没有连接功能,用循环和 printf 来写
Craykon拼接用 s += 片段 — 数会自动变成字符串。
words.连接(", ") 对数字列表也可以用。
控制台.输出(列表) 会用空格隔开输出,要一个一个输出时用不换行的 控制台.接着输出(值)

常见错误

把分隔符接在了值的后面

words = ["red", "green", "blue"]
line = ""
for w in words:
    line += w + ","
print(line)

→ red,green,blue, — 末尾多了一个逗号

使用连接,或者只在不是第一个值时把分隔符接在值的前面:先 if line: line += ",",再 line += w。

直接连接数字列表Python · Java

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

→ Python 报 TypeError: sequence item 0: expected str instance, int found。Java 对 int[] nums 写 String.join(", ", nums) 也是编译错误

Python 用 ", ".join(map(str, nums)) 或 print(*nums, sep=", "),Java 攒到 StringBuilder 里。
JavaScript、C#、Craykon 的连接可以接受数。

用 + 连接两个引号字符串C · C++

char *s = "ab" + "cd";

→ 编译错误 invalid operands to binary + — C 的字符串是地址,不能相加。C++ 中 std::string s = "ab" + "cd"; 也因为同样的原因是编译错误

C 写 char buf[10] = "ab"; strcat(buf, "cd");,C++ 把其中一边变成 std::string:std::string("ab") + "cd"。

各语言的差异
片段很多时,拼接的方式会让时间相差很大。
在与本站评测相同的环境里一个字符一个字符地拼接 20 万次,Java 用 += 约 1 秒,用 StringBuilder 是 1~2ms;C# 用 += 要 2~3 秒,用 StringBuilder 是 1~2ms。
Python 像例子那样在函数外用 += 拼接约 0.5 秒,先攒到列表里再 join 则不到 10ms。
JavaScript(Node.js)用 += 也只要 10ms 左右。
测得的时间因电脑而异。
另外,C++ 中追加数时一定要经过 std::to_string:s += 65 追加的不是 "65",而是编码为 65 的字符 A。

练习题