我是python的新手。目前,我正在学习列表。我尝试将“ words.txt”文件中的每个单词添加到列表中。但是当我尝试
words += word每个字符都成为列表的元素。我尝试了
words += [word],它奏效了。但是我想知道为什么第一种方法使每个字符都是元素而不是单词吗?
fhand = open("words.txt")
words = list()
for line in fhand:
for word in line.split():
words += [word]
print(words)
答案 0 :(得分:1)
要将单词作为元素添加到列表中。
通常使用.append()
fhand = open("words.txt")
words = list()
for line in fhand:
for word in line.split():
words.append(word)
print(words)
答案 1 :(得分:1)
Word
是一个字符串,它本身就是对象(字符)的集合,如果您使用word[0]
,则会获得单词中的第一个元素,默认情况下python列表维护数据类型,因此,当您将字符集追加到列表中并生成字符列表时,字符集仍然是字符集。在第二种情况下,您明确声明要在列表中追加[word]
,而不是字符,因此它成为字符串列表。如果仍然不清楚,请随时发表评论。
答案 2 :(得分:1)
您只能在列表中添加列表,因此,当您在列表中添加字符串时,会将字符串视为字符列表,以便将字符添加为元素,以第二种方式声明您拥有列表,并且单词本身就是元素因此它将整个单词添加为元素。
答案 3 :(得分:0)
在python中,字符串本身在内部是“ unicode”字符的列表,尽管被认为是不同的数据类型。所以当你这样做
words += word
它将每个新字符追加到空列表。
但是,当您执行words += [word]
时,[word]被视为一个单个字符串的列表,因此它仅将一个项目附加到空列表中
答案 4 :(得分:0)
+=
上的list
运算符等效于调用其extend方法,该方法以Iterable作为参数并将每个项目附加到列表中。对于words += word
,+=
的右操作数是一个字符串,可以迭代,因此等效于编写words.extend(word)
。
答案 5 :(得分:0)
让我们检查您的代码:
考虑因素words.txt
由以下文本组成:
hello, I am Solomon
Nice to meet you Solomon
因此,您首先使用fhand = open("words.txt")
打开此文件,然后初始化一个名为words
的列表:
fhand = open("words.txt")
words = list()
建议:建议在此使用with
上下文管理器打开文件。这样,您不必稍后显式关闭文件。如果您只是如上所述使用open()
,则必须最后用fhand.close()
关闭文件。
with open("words.txt", 'r') as fhand:
#<--code--->
在下一行中,您遍历每个line in fhand
。让我们打印line
,它基本上显示了文本中的每一行:
for line in fhand:
print(line)
#Output:
hello, I am Solomon
Nice to meet you Solomon
然后,您在line.split()
上进行迭代,该操作将上述文本行分成单个单词列表。如果我们打印line.split()
:
for line in fhand:
print(line.split())
#Output:
['hello,', 'I', 'am', 'Solomon']
['Nice', 'to', 'meet', 'you', 'Solomon']
建议:您还可以使用splitlines()
将每行(边界)分成一个单独的列表。这与split()
不同,因为它不会将每一行都分成单词。此方法还保留空格,因此,如果文本的末尾或开头有空格,则必须使用strip(' ')
除去空格。这种方法没有副作用,您仍然可以使用它:
for line_str in fhand:
print(line_str.strip(' ').splitlines())
#Output:
['hello, I am Solomon']
['Nice to meet you Solomon']
for line in line_str.strip(' ').splitlines(): #watch the indentation
print(line.split())
#Output:
['hello,', 'I', 'am', 'Solomon']
['Nice', 'to', 'meet', 'you', 'Solomon']
在下一段代码中,您将遍历line.split()
中的每个(单词?或更确切地说是字母)(您知道我们之前已经收到了使用此方法的单词列表),然后递增words
以及每个word
的字母集合。因此,基本上,您会得到一组字母,因为您遍历了列表中的每个单词:
for word in line.split():
words+=word
#Output:
['h', 'e', 'l', 'l', 'o', ',', 'I', 'a', 'm', 'S', 'o', 'l', 'o', 'm', 'o', 'n', 'N', 'i', 'c', 'e', 't', 'o', 'm', 'e', 'e', 't', 'y', 'o', 'u', 'S', 'o', 'l', 'o', 'm', 'o', 'n']
但是您很可能希望在单个列表words
中包含单词列表。我们可以使用append()
方法来实现这一点,因为它需要将word
中的每个line.split()
都添加到words
上(或添加到列表的末尾):
for word in line.split():
words.append(word)
#Output:
['hello,', 'I', 'am', 'Solomon', 'Nice', 'to', 'meet', 'you', 'Solomon']
然后,当我们看另一种words += [word]
时:
for word in line.split():
words += [word]
print(words)
#Output:
['hello,', 'I', 'am', 'Solomon', 'Nice', 'to', 'meet', 'you', 'Solomon']
这与append()
具有相同的作用。为什么呢?让我们打印[word]
,不过是每个单词的列表。这是预料之中的,因为您要从word
中取出每个line.split()
,然后连接到words
:
print([word])
#Output:
['hello,']
['I']
['am']
['Solomon']
['Nice']
['to']
['meet']
['you']
['Solomon']
words += [word]
等效于words = words + [word]
。要查看此串联的工作方式,请考虑以下示例,该示例等效于此语句:
words = list()
word = ["Hello"]
concat_words = words + word
print(concat_words)
#['Hello']
another_word = ["World"]
concat_some_more_words = words + another_word
print(concat_some_more_words)
#['World']
final_concatenation = concat_words + concat_some_more_words
print(final_concatenation)
#Output:
['Hello', 'World']
在此示例上,请尝试append()
:
words1 = list()
words_splitted = ["Hello", "World"]
for word in words_splitted:
words1.append(word)
print(words1)
#['Hello', 'World']
这表明级联等效于追加,但是建议对列表使用append()
print(words1==final_concatenation)
#True
回到原始问题,让我们使用列表推导使整个代码更紧凑:
with open("words.txt", 'r') as fhand:
words = [word for line in fhand for word in line.split()]
print(words)
#Output:
['hello,', 'I', 'am', 'Solomon', 'Nice', 'to', 'meet', 'you', 'Solomon']
您会注意到,作业完成后(退出上下文),我使用with
上下文管理器将文件保持打开/关闭状态。接下来,我创建了一个列表words
,其中包含相同的循环。这也称为列表理解,它是Python中最强大的功能之一。这使代码更紧凑,更易于阅读和faster than appending。
最后,初始化words = []
比words = list()
更干净。 faster也很多。