[英]Beginner question about modifying python list
我是python的新手。 目前我正在學習列表。 我嘗試將“words.txt”文件中的每個單詞添加到列表中。 但是當我嘗試的時候
words += word每個字符都成為列表的一個元素。 我試過了
單詞+ = [單詞]它起作用了。 但我想知道為什么第一種方式使每個角色成為一個元素而不是單詞?
fhand = open("words.txt") words = list() for line in fhand: for word in line.split(): words += [word] print(words)
如果要將單詞添加到列表中作為元素。
通常使用.append()
fhand = open("words.txt")
words = list()
for line in fhand:
for word in line.split():
words.append(word)
print(words)
Word
是一個字符串,它本身就是一個對象(字符)的集合,如果你使用word[0]
,你將獲得單詞中的第一個元素,默認情況下python列表保持數據類型,所以一組字符仍然是一個集合當你將它附加到列表並產生一個字符列表時的字符,在第二種情況下,你明確聲明你要將[word]
追加到列表,而不是它的字符,所以它成為一個字符串列表。 如果仍然不清楚,請隨意評論。
你只能添加列表到列表,所以當你添加字符串列表時,你將字符串視為字符列表,所以它將字符添加為元素,第二種方式你聲明你有列表,單詞是元素本身,所以它添加整個單詞作為元素。
在python中,字符串本身在內部是“unicode”字符列表,雖然被認為是不同的數據類型。 因此,當您執行words += word
它會將每個新字符附加到空列表中。 但是當你執行words += [word]
,[word]被認為是一個單個字符串的列表,因此它只將一個項目附加到空列表中
list
上的+=
運算符等效於調用其extend方法,該方法將iterable作為參數並將每個項追加到列表中。 與words += word
,右手操作數+=
是一個字符串,它是一個可迭代,因此將相當於寫入words.extend(word)
。
讓我們看看你的代碼:
考慮words.txt
包含以下文本:
hello, I am Solomon
Nice to meet you Solomon
因此,首先使用fhand = open("words.txt")
打開此文件,然后初始化一個名為words
的列表:
fhand = open("words.txt")
words = list()
建議 :這里建議使用with
context manager來打開文件。 這樣,您就不必在以后明確地關閉文件。 如果您只是使用上面的open()
,則必須使用fhand.close()
最后關閉該文件。
with open("words.txt", 'r') as fhand:
#<--code--->
在下一行中,您將line in fhand
迭代每一line in fhand
。 讓打印line
基本上顯示文本中的每一行:
for line in fhand:
print(line)
#Output:
hello, I am Solomon
Nice to meet you Solomon
然后你在line.split()
上迭代, 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()
中迭代每個(word?或更確切的字母)(你知道我們之前用這個方法收到了一個單詞列表),然后用每組字母遞增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()
方法實現這一點,因為它接受line.split()
每個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]
,它只是每個單詞的列表。 這是預期的,因為您從line.split()
中獲取每個word
,然后連接到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
context manager在作業完成后將文件打開/關閉到Python(退出上下文)。 接下來,我創建了一個內部具有相同循環的列表words
。 這也稱為列表推導,是Python中最強大的功能之一。 這使得代碼更緊湊,易於閱讀並且比附加更快 。
最后,初始化words = []
比words = list()
更清晰。 它也快得多 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.