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

时间:2015-05-15 05:42:46

标签: python list

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

例如,上一句中包含子字符串'的所有唯一字词。并且' at'是['那']。您的函数应该通过以下doctests:

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)

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

def words_contain2(filename, substring1, substring2):
    files=open(filename,"r")
    files_read=files.read()
    filelist=files_read.split()
    sub1=substring1
    sub2=substring2
    count=0
    result=""
    while count<len(filelist):
        if sub1 in filelist[count] and sub2 in filelist[count]:
            result = result + filelist[count]+","
        count += 1
    print result

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

在我看来,有两个错误:

  1. 我的结果中有一个字符串但不是列表
  2. 该问题给出了一个示例doctest,它只在结果列表中打印一次单词。在文件中,同一个单词可能会出现多次。
  3. 我丢失了原始文件word_tst.txt

3 个答案:

答案 0 :(得分:1)

为包含子字符串的字符串过滤列表而不保持唯一性但使用过滤函数轻松订购

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

但我们需要创建一个维护订单的唯一列表

def words_contain2(filename, substring1, substring2):
    file_ = open(filename, "r")
    content = file_.read()
    not_unique = filter(lambda x:str(x).__contains__(substring1) and str(x).__contains__(substring2), content.split())
    seen = set()
    return [x for x in not_unique if not (x in seen or seen.add(x))]

答案 1 :(得分:0)

将结果保存到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循环从文件中迭代单词

<强> E.g。

result = []
for word in wordslist:
    if sub1 in word and sub2 in word and not word in result:
        result.append(word)

关闭文件对象

的良好做法

<强> e.g。

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

或使用 with statement 打开文件。

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

# do nest coding

注意:提供正确的变量名称。

e.g。 可变名称,例如wordslist,而不是filelist。所以它对其他人来说更具可读性。

答案 2 :(得分:0)

您正确地找到了正确的功能。首先,您使用的是字符串而不是列表。您可以按如下方式创建列表:

result = []

其次,您目前没有检查您找到的单词是否已经在列表中。您可以使用当前使用的相同关键字执行此操作:is

if not (filelist[count] in result):
    result.append(filelist[count])

您还可以在文件列表上使用for循环,而不是使用计数:

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