有关修改python列表的初学者问题

时间:2019-02-01 06:09:41

标签: python python-3.x

我是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)

6 个答案:

答案 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也很多。