Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字典用Python中的第一个字母索引文件_Python_Python 3.x_Dictionary - Fatal编程技术网

字典用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字符。虽然这对你的任务来说可能是正确的,但我很讨厌编写已知潜在问题的代码,因为以后会有太多未知问题占用你的时间。为此,我将介绍几种使用搜索词的替代方法

  • 第一种选择