编写一个带有三个参数的函数,一个文件名和两个子字符串,并返回文件中包含两个子字符串的所有唯一字的列表(按照它们首次出现在文件中的顺序)。
例如,上一句中包含子字符串'的所有唯一字词。并且' 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
在我看来,有两个错误:
我丢失了原始文件word_tst.txt
。
答案 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: