字典用Python中的第一个字母索引文件
下面是我应该做的: 编写一个函数,字典用Python中的第一个字母索引文件,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,下面是我应该做的: 编写一个函数,text\u dictionary(file\u name),它接受一个文件名并返回一个包含键的字典 是一个字母,值是文件中以该字母开头的单词列表。确保列表中包含 只有唯一的值,全部小写,不包含标点符号 这就是我现在拥有的 import string string=string.ascii_lowercase keys=[] for letter in string: keys.append(letter) def text_dictionary(fil
text\u dictionary(file\u name)
,它接受一个文件名并返回一个包含键的字典
是一个字母,值是文件中以该字母开头的单词列表。确保列表中包含
只有唯一的值,全部小写,不包含标点符号
这就是我现在拥有的
import string
string=string.ascii_lowercase
keys=[]
for letter in string:
keys.append(letter)
def text_dictionary(file_name):
with open(file_name,'r') as file:
words=[]
for line in file:
words.append(line.rstrip())
new_list=[]
for i in words:
new_list.append(i.lower())
return new_list
d={}
for words in new_list:
for i in range(25):
if word.startwith(new_list[i])==True:
d[words[i]]+=words
return d
print(d)
代码变得越来越长,我仍然没有得到我想要的。我甚至不知道我在做什么,它是否有用。我不知道字典是否有我不知道的功能。这里真的很沮丧。你让事情变得比需要的更复杂,这就是沮丧的根源。实际的解决方案比你想象的要简单得多 词典有自己的索引。你不需要初始化任何东西。如果一个单词出现在一个不在字典中的字母中,那么你马上添加一个新的键。否则,您将使用已经存在的列表 另一点是,该模块为您提供了在和上拆分的工具。您付出的代价是必须过滤掉一些空字符串,但这是微不足道的 我建议将中间结果存储在s中,而不是列表中,以确保唯一性。最后一步,您始终可以转换为列表 并在实用程序函数中使用返回值而不是打印输出:
def text_dictionary(file_name):
map = {}
with open(file_name,'r') as file:
for line in file:
for word in line.split(string.whitespace + string.punctuation):
if not word:
continue
word = word.lower()
if word[0] not in map:
map[word[0]] = set()
map[word[0]].add(word)
for key in map:
map[key] = list(map[key])
return map
请注意,除了最基本的访问之外,我根本没有使用字典的任何特殊方法或属性
附录1:字典转换
最后一个循环用列表替换集合:它不会创建新的dictionary对象。您可以使用非常相似的循环执行相同的操作:
for key, value in map.items():
map[key] = list(item)
一般来说,在迭代字典时不应该修改它。但是,如果您非常小心地只触摸值而不触摸键,则不会有任何问题,因为哈希表的底层结构不会改变
创建字典很便宜,因此使用字典理解来创建新映射可能会更快:
map = {key: list(value) for key, value in map.items()}
附录2:分词
上面显示的分词算法非常简单。它假定您的文件只包含行为良好的可打印ASCII字符。虽然这对你的任务来说可能是正确的,但我很讨厌编写已知潜在问题的代码,因为以后会有太多未知问题占用你的时间。为此,我将介绍几种使用搜索词的替代方法
\w
模式匹配,该模式
匹配Unicode单词字符;这包括任何语言中可以作为单词一部分的大多数字符,以及数字和下划线。如果使用该标志,则仅匹配[a-zA-Z0-9.]
\w
的反方向是\w
,因此您可以将其用于:
for word in re.finditer(r'\w+', line):
with
块之前进行编译,因此每个文件至少编译一次,而不是每行编译一次。全局定义或函数内定义,如下所示
pattern = re.compile(r'\w') # or r'\W', as you prefer
作为默认参数:
def text_dictionary(file_name, pattern=re.compile(r'\w')):
如果您决定修改包含/拆分的字符集,后一种方法将为您提供灵活性
在任何一种情况下,循环都将是
for word in pattern.split(line): # or pattern.finditer(line)
你让事情变得比需要的更复杂,这就是挫折感的来源。实际的解决方案比你想象的要简单得多 词典有自己的索引。你不需要初始化任何东西。如果一个单词出现在一个不在字典中的字母中,那么你马上添加一个新的键。否则,您将使用已经存在的列表 另一点是,该模块为您提供了在和上拆分的工具。您付出的代价是必须过滤掉一些空字符串,但这是微不足道的 我建议将中间结果存储在s中,而不是列表中,以确保唯一性。最后一步,您始终可以转换为列表 并在实用程序函数中使用返回值而不是打印输出:
def text_dictionary(file_name):
map = {}
with open(file_name,'r') as file:
for line in file:
for word in line.split(string.whitespace + string.punctuation):
if not word:
continue
word = word.lower()
if word[0] not in map:
map[word[0]] = set()
map[word[0]].add(word)
for key in map:
map[key] = list(map[key])
return map
请注意,除了最基本的访问之外,我根本没有使用字典的任何特殊方法或属性
附录1:字典转换
最后一个循环用列表替换集合:它不会创建新的dictionary对象。您可以使用非常相似的循环执行相同的操作:
for key, value in map.items():
map[key] = list(item)
一般来说,在迭代字典时不应该修改它。但是,如果您非常小心地只触摸值而不触摸键,则不会有任何问题,因为哈希表的底层结构不会改变
创建字典很便宜,因此使用字典理解来创建新映射可能会更快:
map = {key: list(value) for key, value in map.items()}
附录2:分词
上面显示的分词算法非常简单。它假定您的文件只包含行为良好的可打印ASCII字符。虽然这对你的任务来说可能是正确的,但我很讨厌编写已知潜在问题的代码,因为以后会有太多未知问题占用你的时间。为此,我将介绍几种使用搜索词的替代方法