返回python文件中所有唯一单词的列表

2024-05-15 07:38:00 发布

您现在位置:Python中文网/ 问答频道 /正文

编写一个接受三个参数、一个文件名和两个子字符串的函数,并返回包含这两个子字符串的文件中所有唯一单词的列表(按它们在文件中第一次出现的顺序)。在

例如,前一句中包含子串“th”和“at”的所有唯一单词都是['that']。您的函数应通过以下doctest:

def words_contain2(filename, substring1, substring2):

    """
    >>> words_contain2('words_tst.txt', 're', 'cu')
    ['recursively', 'recursive.']
    >>> words_contain2('words_tst.txt', 'th', 'at')
    ['that']
    >>> words_contain2('/usr/share/dict/words', 'ng', 'warm')
    ['afterswarming', 'hearthwarming', 'housewarming', 'inswarming', 'swarming', 'unswarming', 'unwarming', 'warming', 'warmonger', 'warmongering']
    """

if __name__ == '__main__':
    import doctest
    doctest.testmod(verbose = True)

实际上我已经试过这样做了:

^{pr2}$

但它返回结果为recursively, recursively, recursive, recursively

在我看来,有两个错误:

  1. 我的结果中有一个字符串,但没有列表
  2. 这个问题给出了一个doctest示例,它只在结果列表中打印一次单词。在文件中,同一个单词可能多次出现。在

我丢失了原始文件word_tst.txt。在


Tags: 文件函数字符串txt列表that单词at
3条回答

你正朝着正确的方向前进。首先,您使用的是字符串而不是列表。可以按如下方式创建列表:

result = []

其次,你当前没有检查你找到的单词是否已经在列表中。您可以使用当前使用的同一关键字:is

^{pr2}$

也可以在文件列表上使用for循环,而不是使用count:

for word in filelist:
    if sub1 in word and sub2 in word:

将结果保存到list datatype中,然后检查结果列表中是否已存在单词。如果不存在,则将单词追加到结果列表中,否则忽略。在

演示

result = []  #- Define result ad list data type
while count<len(filelist):
    if sub1 in filelist[count] and sub2 in filelist[count]:
        if not filelist[count] in result:  #- check already present or not
            result.append(filelist[count])  #- Add world into list

    count += 1

以字符串格式打印结果:

print " ".join(result)


我们可以使用for loop从文件中迭代单词

例如

^{pr2}$

关闭文件对象的良好练习

例如

fp = open(filename,"r")
files_read=fp.read()
fp.close()

或用with语句打开文件。在

with open(filename) as fp:
    data = fp.read()

# do nest coding

注意:给出正确的变量名。在

例如,可变名称类似于wordslist,而不是{}。所以对其他人来说更具可读性。在

过滤包含子字符串的字符串的列表而不保持唯一性,但是使用过滤器函数可以很容易地排序

not_unique = filter(lambda x:str(x).__contains__(substring1) and str(x).__contains__(substring2), content.split())

但我们需要创建一个唯一的列表并保持顺序

^{pr2}$

相关问题 更多 >