如何将字符串拆分为列表?

Posted

技术标签:

【中文标题】如何将字符串拆分为列表?【英文标题】:How to split a string into a list? 【发布时间】:2010-10-19 03:10:18 【问题描述】:

我希望我的 Python 函数拆分一个句子(输入)并将每个单词存储在一个列表中。我当前的代码拆分句子,但不将单词存储为列表。我该怎么做?

def split_line(text):

    # split the text
    words = text.split()

    # for each word in the line:
    for word in words:

        # print the word
        print(words)

【问题讨论】:

这段代码的哪一部分不起作用?您能否提供错误消息或您遇到的问题? 照原样,您将为列表中的每个单词打印完整的单词列表。我认为您的意思是使用 print(word) 作为最后一行。 【参考方案1】:

shlex 有一个.split() 函数。它与str.split() 的不同之处在于它不保留引号并将引用的短语视为单个单词:

>>> import shlex
>>> shlex.split("sudo echo 'foo && bar'")
['sudo', 'echo', 'foo && bar']

注意:它适用于类 Unix 命令行字符串。它不适用于自然语言处理。

【讨论】:

谨慎使用,尤其是对于 NLP。它会在 "It's good."ValueError: No closing quotation 之类的单引号字符串上崩溃【参考方案2】:

在不损害单词内部撇号的情况下拆分单词 请找出 input_1 和 input_2 摩尔定律

def split_into_words(line):
    import re
    word_regex_improved = r"(\w[\w']*\w|\w)"
    word_matcher = re.compile(word_regex_improved)
    return word_matcher.findall(line)

#Example 1

input_1 = "computational power (see Moore's law) and "
split_into_words(input_1)

# output 
['computational', 'power', 'see', "Moore's", 'law', 'and']

#Example 2

input_2 = """Oh, you can't help that,' said the Cat: 'we're all mad here. I'm mad. You're mad."""

split_into_words(input_2)
#output
['Oh',
 'you',
 "can't",
 'help',
 'that',
 'said',
 'the',
 'Cat',
 "we're",
 'all',
 'mad',
 'here',
 "I'm",
 'mad',
 "You're",
 'mad']

【讨论】:

【参考方案3】:

如果您想要一个列表中的单词/句子的所有字符,请执行以下操作:

print(list("word"))
#  ['w', 'o', 'r', 'd']


print(list("some sentence"))
#  ['s', 'o', 'm', 'e', ' ', 's', 'e', 'n', 't', 'e', 'n', 'c', 'e']

【讨论】:

【参考方案4】:

根据您打算如何处理句子列表,您可能需要查看Natural Language Took Kit。它主要处理文本处理和评估。你也可以用它来解决你的问题:

import nltk
words = nltk.word_tokenize(raw_sentence)

这有一个额外的好处,那就是分开标点符号。

例子:

>>> import nltk
>>> s = "The fox's foot grazed the sleeping dog, waking it."
>>> words = nltk.word_tokenize(s)
>>> words
['The', 'fox', "'s", 'foot', 'grazed', 'the', 'sleeping', 'dog', ',', 
'waking', 'it', '.']

这允许您过滤掉任何您不想要的标点符号并只使用单词。

请注意,如果您不打算对句子进行任何复杂的操作,使用string.split() 的其他解决方案会更好。

[已编辑]

【讨论】:

split() 依赖空格作为分隔符,因此它无法分隔连字符 - 并且长破折号分隔的短语也将无法分割。如果句子中包含任何没有空格的标点符号,则这些标点符号将无法粘贴。对于任何现实世界的文本解析(例如此评论),您的 nltk 建议比 split()` 好得多。 可能有用,尽管我不会将其描述为拆分成“单词”。根据任何简单的英语定义,','"'s" 都不是单词。通常,如果您想以标点符号感知的方式将上面的句子拆分为“单词”,您需要去掉逗号并将"fox's" 作为一个单词。 Python 2.7+ 截至 2016 年 4 月。【参考方案5】:

在任何连续运行的空白处拆分 text 中的字符串。

words = text.split()      

在分隔符text 中拆分字符串:","

words = text.split(",")   

words 变量将是一个list 并包含来自text 的单词在分隔符上拆分。

【讨论】:

【参考方案6】:
text.split()

这应该足以将每个单词存储在列表中。 words 已经是句子中的单词列表,所以不需要循环。

其次,这可能是一个错字,但你的循环有点混乱。如果你真的想使用追加,那就是:

words.append(word)

不是

word.append(words)

【讨论】:

【参考方案7】:

str.split()

返回字符串中的单词列表,使用 sep 作为分隔符 ... 如果 sep 未指定或为 None,则应用不同的拆分算法:连续空格的运行被视为单个分隔符,如果字符串有前导或尾随,则结果将在开头或结尾不包含空字符串空白。

>>> line="a sentence with a few words"
>>> line.split()
['a', 'sentence', 'with', 'a', 'few', 'words']
>>> 

【讨论】:

@warvariuc - 应该链接到docs.python.org/2/library/stdtypes.html#str.split 如何将单词“sentence”拆分成“s”“e”“n”“t”......?【参考方案8】:

这个算法怎么样?在空白处拆分文本,然后修剪标点符号。这会小心地删除单词边缘的标点符号,而不会损害诸如 we're 等单词中的撇号。

>>> text
"'Oh, you can't help that,' said the Cat: 'we're all mad here. I'm mad. You're mad.'"

>>> text.split()
["'Oh,", 'you', "can't", 'help', "that,'", 'said', 'the', 'Cat:', "'we're", 'all', 'mad', 'here.', "I'm", 'mad.', "You're", "mad.'"]

>>> import string
>>> [word.strip(string.punctuation) for word in text.split()]
['Oh', 'you', "can't", 'help', 'that', 'said', 'the', 'Cat', "we're", 'all', 'mad', 'here', "I'm", 'mad', "You're", 'mad']

【讨论】:

不错,但有些英语单词确实包含尾随标点符号。例如,e.g.Mrs. 中的尾随点,以及所有格 frogs' 中的尾随撇号(如 frogs' legs)是单词的一部分,但会被此算法删除。正确处理缩写可以大致通过检测点分隔的首字母加上使用特殊情况字典(如Mr.Mrs.)来实现。区分所有格撇号和单引号要困难得多,因为它需要解析包含该单词的句子的语法。 @MarkAmery 你是对的。从那以后我也想到了一些标点符号——比如破折号——可以在没有空格的情况下分隔单词。【参考方案9】:

我认为您因为错字而感到困惑。

在循环中将 print(words) 替换为 print(word) 以使每个单词都打印在不同的行上

【讨论】:

【参考方案10】:

我希望我的 python 函数拆分一个句子(输入)并将每个单词存储在一个列表中

str().split() 方法就是这样做的,它接受一个字符串,将其拆分为一个列表:

>>> the_string = "this is a sentence"
>>> words = the_string.split(" ")
>>> print(words)
['this', 'is', 'a', 'sentence']
>>> type(words)
<type 'list'> # or <class 'list'> in Python 3.0

您遇到的问题是因为拼写错误,您写的是print(words) 而不是print(word)

word 变量重命名为current_word,这就是你所拥有的:

def split_line(text):
    words = text.split()
    for current_word in words:
        print(words)

..当你应该做的时候:

def split_line(text):
    words = text.split()
    for current_word in words:
        print(current_word)

如果出于某种原因您想在 for 循环中手动构造一个列表,您将使用列表 append() 方法,可能是因为您想将所有单词小写(例如):

my_list = [] # make empty list
for current_word in words:
    my_list.append(current_word.lower())

或者更简洁一点,使用list-comprehension:

my_list = [current_word.lower() for current_word in words]

【讨论】:

以上是关于如何将字符串拆分为列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过特定的字符串元素将字符串列表拆分为字符串的子列表

如何将逗号分隔的字符串拆分为字符串列表?

您知道如何将字符串列表拆分为不同的变量吗?

如何将字符串拆分为列表并在python中将两个已知令牌合并为一个?

python映射字符串拆分列表

REGEX 使用关键字将字符串拆分为列表