python中列表的性质,为什么我会得到一个重复列表?

python中列表的性质,为什么我会得到一个重复列表?,python,Python,所以,我在为Coursera上的作业编写程序,我解决了它,但我得到了一些意想不到的行为。 输入romeo.txt时,输入以下代码: fname = input("Enter file name: ") fh = open(fname, 'r') lst = list() words = '' fin = list() for line in fh: words += line.strip(' ') words = words.replace('\n', ' ') for line i

所以,我在为Coursera上的作业编写程序,我解决了它,但我得到了一些意想不到的行为。 输入romeo.txt时,输入以下代码:

fname = input("Enter file name: ")
fh = open(fname, 'r')
lst = list()
words = ''
fin = list()
for line in fh:
    words += line.strip(' ')

words = words.replace('\n', ' ')

for line in words:
    lst += words.split(' ')
print(lst)

它不是给我一个只出现一次的单词列表,而是给我每个单词,但重复次数未知

Gives me a huge list
of repeating words: ['But', 'soft', 'what', 'light', 'through', 'yonder', 'window', 'breaks', 'It', 'is', 'the', 'east', 'and', 'Juliet', 'is', 'the', 'sun', 'Arise', 'fair', 'sun', 'and', 'kill', 'the', 'envious', 'moon', 'Who', 'is', 'already', 'sick', 'and', 'pale', 'with', 'grief', 'But', 'soft', 'what', 'light', 'through', 'yonder', 'window', 'breaks', 'It', 'is', 'the', 'east', 'and', 'Juliet', 'is', 'the', 'sun', 'Arise', 'fair', 'sun', 'and', 'kill', 'the', 'envious', 'moon', 'Who', 'is', 'already', 'sick', 'and', 'pale', 'with', 'grief', 'But', 'soft', 'what', 'light', 'through', 'yonder', 'window', 'breaks', 'It', 'is', 'the', 'east', 'and', 'Juliet', 'is', 'the', 'sun', 'Arise', 'fair', 'sun', 'and', 'kill', 'the', 'envious', 'moon', 'Who', 'is', 'already', 'sick', 'and', 'pale', 'with', 'grief', 'But', 'soft', 'what', 'light', 'through', 'yonder', 'window', 'breaks', 'It', 'is', 'the', 'east', 'and', 'Juliet', 'is', 'the', 'sun', 'Arise', 'fair', 'sun' . . . ., 

单词的重复次数远不止这些。

不确定实际的问题是什么,但是如果您想要一个不允许重复的列表,那么您想要的数据类型是一个集合。集合不允许重复,因此如果您尝试向已经存在的集合添加字符串,它将跳过该字符串。尝试初始化集合,而不是列表。也可以这样初始化空白列表:

lst = []

不确定实际的问题是什么,但是如果您想要一个不允许重复的列表,那么您想要的数据类型是一个集合。集合不允许重复,因此如果您尝试向已经存在的集合添加字符串,它将跳过该字符串。尝试初始化集合,而不是列表。也可以这样初始化空白列表:

lst = []

Python列表不应是唯一的。它们保留了事物插入的顺序。如果您想要唯一的单词集,请使用Python。可以通过向集合传递列表来创建集合,如将最后一行更改为

printsetlst

或者,您可以创建一个空集,然后在遇到单词时向其中添加单词,类似这样:

s = set()
...
for... :
  s.update(words.split(' '))

Python列表不应是唯一的。它们保留了事物插入的顺序。如果您想要唯一的单词集,请使用Python。可以通过向集合传递列表来创建集合,如将最后一行更改为

printsetlst

或者,您可以创建一个空集,然后在遇到单词时向其中添加单词,类似这样:

s = set()
...
for... :
  s.update(words.split(' '))
起初你说:

words = ''
for line in fh:
    words += line.strip(' ')
words = words.replace('\n', ' ')
for line in words:
    lst += words.split(' ')
嗯。所以单词是一个字符串。 然后你说,

words = ''
for line in fh:
    words += line.strip(' ')
words = words.replace('\n', ' ')
for line in words:
    lst += words.split(' ')
对于文件中的每一行,从当前行中删除空格并将其附加到单词中。您要附加到单词字符串的每次迭代。循环完成后,单词将成为一个巨大的字符串

然后你说,

words = ''
for line in fh:
    words += line.strip(' ')
words = words.replace('\n', ' ')
for line in words:
    lst += words.split(' ')
嗯。单词仍然是一个字符串。您所做的就是用空格替换所有换行符

然后你说,

words = ''
for line in fh:
    words += line.strip(' ')
words = words.replace('\n', ' ')
for line in words:
    lst += words.split(' ')
在本例中,line不是这个临时变量的好名称,因为您不再遍历这些行了。你的表是单词,它是一个字符串。迭代字符串时,得到的是单个字符,而不是行:

>>> for line in "abcdefg":
    print(line)


a
b
c
d
e
f
g
>>> 
仅仅因为我调用了临时变量行,并不意味着它实际上就是这样。我可以称它为任何东西,但我仍然会收到相同的输出。因此,这个变量的更好名称是char,例如

回到您的代码段,因为您正在迭代Word字符串中的字符,所以您正在使用Word.split“”的结果扩展列表,每个字符一次!我不需要看你的输入文件就知道那是一个巨大的列表。lst列表中的字符串数大约等于文件中的字数乘以文件中的字符数。

最初您说:

words = ''
for line in fh:
    words += line.strip(' ')
words = words.replace('\n', ' ')
for line in words:
    lst += words.split(' ')
嗯。所以单词是一个字符串。 然后你说,

words = ''
for line in fh:
    words += line.strip(' ')
words = words.replace('\n', ' ')
for line in words:
    lst += words.split(' ')
对于文件中的每一行,从当前行中删除空格并将其附加到单词中。您要附加到单词字符串的每次迭代。循环完成后,单词将成为一个巨大的字符串

然后你说,

words = ''
for line in fh:
    words += line.strip(' ')
words = words.replace('\n', ' ')
for line in words:
    lst += words.split(' ')
嗯。单词仍然是一个字符串。您所做的就是用空格替换所有换行符

然后你说,

words = ''
for line in fh:
    words += line.strip(' ')
words = words.replace('\n', ' ')
for line in words:
    lst += words.split(' ')
在本例中,line不是这个临时变量的好名称,因为您不再遍历这些行了。你的表是单词,它是一个字符串。迭代字符串时,得到的是单个字符,而不是行:

>>> for line in "abcdefg":
    print(line)


a
b
c
d
e
f
g
>>> 
仅仅因为我调用了临时变量行,并不意味着它实际上就是这样。我可以称它为任何东西,但我仍然会收到相同的输出。因此,这个变量的更好名称是char,例如


回到您的代码段,因为您正在迭代Word字符串中的字符,所以您正在使用Word.split“”的结果扩展列表,每个字符一次!我不需要看你的输入文件就知道那是一个巨大的列表。lst列表中的字符串数将大约等于文件中的字数乘以文件中的字符数。

对于文字中的行:lst+=line.split“”?你肯定不想在这里添加单词,你是说结果列表与romeo.txt中的单词从左到右的顺序不同吗?@chris_rands,但为什么不呢?对于单词中的行:lst+=line.split“”?你肯定不想在这里添加单词,你是说结果列表的顺序与romeo.txt中的单词从左到右的顺序不同吗?@chris_rands,但为什么不呢?我们发现
d同时也是真正的问题,但你是1。更快,2。你的解释比我的好得多+1但我建议您添加一个使用集合执行task@gboffi非常感谢。我意识到,当OP说,而不是给我一个只出现一次的单词列表时,听起来他们确实想要一套。然而,我不相信OP的措辞就是这样理解的。我们不知道他们的Coursera作业要求的是什么至少我不知道,而且我也不知道OP仅仅通过查看代码来保留唯一单词的任何尝试。也许他们的意思是,在一个长得离谱的列表中,他们期待着一次打印出所有单词的列表OP:如果我的假设是错误的,看看GBOFI的答案。等等,你是说我在重复字母而不是单词????也就是说,每次我被击中,我都会把这个词放在名单上???哦,上帝,上帝!!!!我们同时发现了真正的问题,但你是1。更快,2。你的解释比我的好得多+1但我建议您添加一个使用集合执行task@gboffi非常感谢。我意识到,当OP说,而不是给我一个只出现一次的单词列表时,听起来他们确实想要一套。然而,我不相信OP的措辞就是这样理解的。我们不知道他们的Coursera作业要求的是什么至少我不知道,而且我也不知道OP仅仅通过查看代码来保留唯一单词的任何尝试。也许他们的意思是,在一个长得离谱的列表中,他们期待着一次打印出所有单词的列表OP:如果我的假设是错误的,看看GBOFI的答案。等等,你是说我在重复字母而不是单词????也就是说,每次我被击中,我都会把这个词放在名单上???哦,上帝,上帝!!!!