乐趣区

关于人工智能:教你Python字符串的基本操作拆分和连接

拆分字符串
在 Python 中,字符串示意为 str 对象,它们是不可变的:这意味着不能间接更改内存中示意的对象。这两个事实能够帮忙您学习(而后记住)如何应用.split().

您是否曾经猜到字符串的这两个个性与 Python 中的拆分性能有何关系?如果您猜想这.split()是一个实例办法,因为字符串是一种非凡类型,那么您是对的!在其余一些语言(如 Perl)中,原始字符串用作独立.split()函数的输出,而不是对字符串自身调用的办法。

留神:调用字符串办法的办法

像这样的字符串办法.split()在这里次要显示为在字符串上调用的实例办法。它们也能够被称为静态方法,但这并不现实,因为它更“简短”。为了残缺起见,这里有一个例子:

# Avoid this:
str.split('a,b,c', ',')

当您将其与首选用法进行比拟时,这既轻便又蠢笨:

# Do this instead:
'a,b,c'.split(',')

无关 Python 中的实例、类和静态方法的更多信息,请查看咱们的深刻教程。

字符串不变性怎么样?这应该提醒您字符串办法不是就地操作,但它们会在内存中返回一个新对象。

留神:就地操作

就地操作是间接更改调用它们的对象的操作。一个常见的例子是在列表上应用的.append()办法:当你调用一个列表时,通过将输出增加到同一个列表来间接更改该列表。.append().append()

无参数拆分
在深刻之前,让咱们看一个简略的例子:

>>> 'this is my string'.split()
['this', 'is', 'my', 'string']

这实际上是.split()调用的一个特例,我抉择它是为了它的简略性。没有指定任何分隔符,.split()将任何空格都算作分隔符。

裸调用的另一个特点.split()是它会主动删除前导和尾随空格,以及间断的空格。比拟.split()在没有分隔符参数的状况下调用以下字符串和有 ’ ‘ 作为分隔符参数的调用:

 

>>> s = 'this   is  my string'
>>> s.split()
['this', 'is', 'my', 'string']
>>> s.split(' ')
['','this','', '','is','', 'my', 'string', '']

首先要留神的是,这展现了 Python 中字符串的不变性:后续调用.split()解决原始字符串,而不是第一次调用.split().

您应该看到的第二件事也是次要的事件是,bare .split()call 提取句子中的单词并抛弃任何空格。

指定分隔符
.split(‘ ‘),另一方面,更字面意思。当有前导或尾随分隔符时,您将失去一个空字符串,您能够在后果列表的第一个和最初一个元素中看到该字符串。

如果有多个间断的分隔符(例如“this”和“is”之间以及“is”和“my”之间),第一个将用作分隔符,随后的分隔符将进入您的后果列表作为空字符串。

留神:调用中的分隔符 .split()

尽管下面的示例应用单个空格字符作为 的分隔符输出.split(),但用作分隔符的字符类型或字符串长度不受限制。惟一的要求是你的分隔符是一个字符串。你能够应用从 ”…” 到 even 的任何货色 ”separator”。

应用 Maxsplit 限度拆分
.split() 有另一个可选参数称为 maxsplit. 默认状况下,.split()将在调用时进行所有可能的拆分。maxsplit 然而,当您为 赋值时,只会进行给定数量的拆分。应用咱们之前的示例字符串,咱们能够看到 maxsplit:

>>> s = "this is my string"
>>> s.split(maxsplit=1)
['this', 'is my string']

如上所示,如果设置 maxsplit 为 1,则第一个空白区域将用作分隔符,其余的将被疏忽。让咱们做一些练习来测试到目前为止咱们学到的所有。

练习:“本人尝试:Maxsplit”显示暗藏当你给一个正数作为 maxsplit 参数时会产生什么?

解决方案:“本人尝试:Maxsplit”显示暗藏.split()将在所有可用的分隔符上拆分您的字符串,这也是 maxsplit 未设置时的默认行为。

练习:“局部了解查看”显示暗藏

您最近收到了一个格局十分蹩脚的逗号分隔值 (CSV) 文件。您的工作是将每一行提取到一个列表中,该列表的每个元素代表该文件的列。是什么让它格局谬误?“地址”字段蕴含多个逗号,但须要在列表中示意为单个元素!

假如您的文件已作为以下多行字符串加载到内存中:

Name,Phone,Address
Mike Smith,15554218841,123 Nice St, Roy, NM, USA
Anita Hernandez,15557789941,425 Sunny St, New York, NY, USA
Guido van Rossum,315558730,Science Park 123, 1098 XG Amsterdam, NL

您的输入应该是一个列表:

[['Mike Smith', '15554218841', '123 Nice St, Roy, NM, USA'],
    ['Anita Hernandez', '15557789941', '425 Sunny St, New York, NY, USA'],
    ['Guido van Rossum', '315558730', 'Science Park 123, 1098 XG Amsterdam, NL']
]

每个外部列表代表咱们感兴趣的 CSV 行,而内部列表将它们保留在一起。

解决方案:“局部了解查看”显示暗藏

这是我的解决方案。有几种办法能够攻打它。重要的是您应用.split()了它的所有可选参数并取得了预期的输入:

input_string = """Name,Phone,Address
Mike Smith,15554218841,123 Nice St, Roy, NM, USA
Anita Hernandez,15557789941,425 Sunny St, New York, NY, USA
Guido van Rossum,315558730,Science Park 123, 1098 XG Amsterdam, NL"""

def string_split_ex(unsplit):
    results = []

    # Bonus points for using splitlines() here instead, 
    # which will be more readable
    for line in unsplit.split('\n')[1:]:
        results.append(line.split(',', maxsplit=2))

    return results

print(string_split_ex(input_string))

咱们.split()在这里打了两次电话。第一次应用可能看起来很吓人,但别放心!咱们将逐渐实现它,您会对这些表达式感到称心。让咱们再看看第一个.split()调用:unsplit.split(‘\n’)[1:].

第一个元素是 unsplit,它只是指向输出字符串的变量。而后咱们有咱们的.split()电话:.split(‘\n’)。在这里,咱们正在拆分一个称为换行符的特殊字符。

有什么作用 \n?顾名思义,它通知正在读取字符串的任何人,它前面的每个字符都应该显示在下一行。在像咱们这样的多行字符串中,每行开端 input_string 都有一个暗藏 \n。

最初一部分可能是新的:[1:]. 到目前为止的语句给了咱们一个内存中的新列表,[1:]看起来像一个列表索引符号,它是——有点!这个扩大的索引符号给了咱们一个列表 slice。在这种状况下,咱们取 index 处的元素 1 及其后的所有元素,抛弃 index 处的元素 0。

总之,咱们遍历一个字符串列表,其中每个元素代表多行输出字符串中除了第一行之外的每一行。

在每个字符串中,咱们.split()再次调用 using, 作为拆分字符,但这次咱们只应用 maxsplit 前两个逗号进行拆分,而地址放弃不变。而后咱们将该调用的后果附加到失当命名的 results 数组并将其返回给调用者。

连贯和连贯字符串
另一个根本的字符串操作与拆分字符串相同:字符串连贯。如果你没见过这个词,别放心。这只是说“粘合在一起”的一种奇异形式。

与 + 运算符连贯
有几种办法能够做到这一点,具体取决于您要实现的指标。最简略和最罕用的办法是应用加号 (+)将多个字符串相加。只需将 a 放在 + 您想要连贯在一起的任意数量的字符串之间:


>>> 'a' + 'b' + 'c'
'abc'

为了与数学主题保持一致,您还能够将字符串相乘以反复它:


>>> 'do' * 2
'dodo'

请记住,字符串是不可变的!如果连贯或反复存储在变量中的字符串,则必须将新字符串调配给另一个变量以保留它。


>>> orig_string = 'Hello'
>>> orig_string + ', world'
'Hello, world'
>>> orig_string
'Hello'
>>> full_sentence = orig_string + ', world'
>>> full_sentence
'Hello, world'

如果咱们没有不可变的字符串,full_sentence 则会输入 ’Hello, world, world’.

另一个注意事项是 Python 不进行隐式字符串转换。如果您尝试将字符串与非字符串类型连接起来,Python 将引发一个 TypeError:


>>> 'Hello' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be str, not int

这是因为您只能将字符串与其余字符串连接起来,如果您来自像 JavaScript 这样试图进行隐式类型转换的语言,这对您来说可能是一种新行为。

在 Python 中从列表到字符串 .join()
还有另一种更弱小的办法能够将字符串连贯在一起。您能够应用该 join()办法从 Python 中的列表转换为字符串。

这里的常见用例是当您有一个由字符串组成的可迭代对象(如列表),并且您心愿将这些字符串组合成一个字符串时。就像.split(),.join()是一个字符串实例办法。如果您所有的字符串都在一个可迭代对象中,您会调用哪一个.join()?

这是一个有点辣手的问题。请记住,当您应用 时.split(),您将在要拆分的字符串或字符上调用它。相同的操作是.join(),因而您能够在要用于将可迭代字符串连贯在一起的字符串或字符上调用它:


>>> strings = ['do', 're', 'mi']
>>> ','.join(strings)
'do,re,mi'

在这里,咱们 strings 用逗号 (,)连贯列表的每个元素,并调用.join()它而不是 strings 列表。

练习:“通过退出进步可读性”显示暗藏

如何使输入文本更具可读性?

解决方案:“通过退出进步可读性”显示暗藏

您能够做的一件事是增加间距:


>>> strings = ['do', 're', 'mi']
>>> ','.join(strings)
'do, re, mi

通过在咱们的连贯字符串中增加一个空格,咱们大大提高了输入的可读性。在退出字符串以进步可读性时,您应该始终牢记这一点。

.join()很聪慧,因为它将您的“joiner”插入到您想要退出的可迭代的字符串之间,而不是仅仅在可迭代的每个字符串的开端增加您的 joiner。这意味着,如果您传递 size 的迭代 1,您将看不到您的加入者:


>>> 'b'.join(['a'])
'a'

练习:“局部了解查看”显示暗藏

应用咱们的网页抓取教程,您曾经构建了一个很棒的天气抓取工具。然而,它会在列表列表中加载字符串信息,每个列表都蕴含要写出到 CSV 文件的惟一信息行:

[['Boston', 'MA', '76F', '65% Precip', '0.15 in'],
    ['San Francisco', 'CA', '62F', '20% Precip', '0.00 in'],
    ['Washington', 'DC', '82F', '80% Precip', '0.19 in'],
    ['Miami', 'FL', '79F', '50% Precip', '0.70 in']
]

您的输入应该是如下所示的单个字符串:

"""
Boston,MA,76F,65% Precip,0.15in
San Francisco,CA,62F,20% Precip,0.00 in
Washington,DC,82F,80% Precip,0.19 in
Miami,FL,79F,50% Precip,0.70 in
"""

解决方案:“局部了解查看”显示暗藏

对于此解决方案,我应用了列表推导式,这是 Python 的一项弱小性能,可让您疾速构建列表。如果您想理解更多对于它们的信息,请查看这篇涵盖 Python 中所有可用推导式的精彩文章。

以下是我的解决方案,以列表列表开始并以单个字符串结尾:

input_list = [['Boston', 'MA', '76F', '65% Precip', '0.15 in'],
    ['San Francisco', 'CA', '62F', '20% Precip', '0.00 in'],
    ['Washington', 'DC', '82F', '80% Precip', '0.19 in'],
    ['Miami', 'FL', '79F', '50% Precip', '0.70 in']
]

# We start with joining each inner list into a single string
joined = [','.join(row) for row in input_list]

# Now we transform the list of strings into a single string
output = '\n'.join(joined)

print(output)

这里咱们.join()不是用一次,而是用了两次。首先,咱们在列表推导中应用它,它将每个外部列表中的所有字符串组合成一个字符串。接下来,咱们将每个字符串与 \n 咱们之前看到的换行符连接起来。最初,咱们简略地打印后果,以便咱们能够验证它是否合乎咱们的预期。

把这所有捆绑在一起
只管 Python 中最根本的字符串操作(拆分、连贯和连贯)的概述到此结束,但仍有大量字符串办法能够让您更轻松地操作字符串。

一旦把握了这些根本的字符串操作,您可能想理解更多。

退出移动版