获取 .txt 文件目录和 returns 基于设置参数的字典的函数?

function that takes directory of .txt file and returns a dictionary based on set parameters?

我想制作一个函数,将 .txt 文件的目录作为输入,returns 是一个基于特定参数的字典。如果 .txt 文件为空, 那么该函数将 return 什么都没有。在编写这个函数时,我要求 没有导入,没有列表推导,只使用 for/while 和 if 语句 .

这是为了我现在正在学习的内容,我希望能够一步一步地学习和解释这个功能。

下面是 .txt 文件的示例。行的数量可能会有所不同,但每行的格式都会按以下顺序显示:

word + 一串由逗号连接的 3 个数字。

terra,4,5,6

cloud,5,6,7

squall,6,0,8

terra,4,5,8

cloud,6,5,7

首先我想分解一下函数的步骤

由逗号分隔的字符串的每个组成部分都有特定的用途:

  1. 字符串中的最后一个数字将减去字符串中倒数第二个数字以形成字典中的值。

例如terra,4,5,6的最后两个字符将被减去字典中的[1]的值

  1. 按字母顺序排列的单词将构成字典的键。如果 .txt 文件中有多个相同单词的条目,则将形成一个键 它将包含重复键的所有值。

例如,terra,4,5,6terra,4,4,6terra,4,4,7将分别输出('terra', 4):[1,2,3]作为键和值。

  1. 但是,为了将键标记为重复,键的第一个值必须相同。如果不是,那么它们将是单独的值。

例如,terra,4,5,6terra,5,4,6 在字典中将分别显示为 ('terra', 4):[1]('terra', 5):[2]

示例输入

如果我们使用上面提到的示例 .txt 文件,输入应该类似于 create_dict("***files/example.txt") 并且应该输出字典 {('terra', 4):[1,3],('cloud', 5):[1],('squall', 6):[8],('cloud', 6):[2]}。为了重新创建此示例,我将添加一个 link to the .txt file(注意 *** 是目录其余部分的占位符)

我在尝试什么:

testfiles = (open("**files/example.txt").read()).split('\n')
int_list = []
alpha_list = []
for values in testfiles:
    ao = values.split(',') #returns only a portion of the list. why?
for values in ao:
    if values.isnumeric():
        int_list.append(values) #retrives list of ints from list
for values in ao:
    if values.isalpha():
        alpha_list.append(values) #retrieves a list of words
{((alpha_list[0]), int(int_list[0])):(int(int_list[2])-(int(int_list[1])))} #each line will always have 3 number values so I used index

this returns {('squall', 6): 1} 这主要只是一个概念证明,而不是功能的解决方案。我想看看是否可以使用我在 int_list 和 alpha_list 中找到的数字和单词使用索引生成字典中的条目。如果可能,可以对 .txt 文件中的其余字符串应用相同的方法。

您输入的是 CSV 格式。 你真的应该使用其中之一

因为 comma-separated 字段中的“奇数”字符 是 non-trivial 来处理。 最好让图书馆担心这些细节。

使用defaultdict(list)是最自然的方式, 最可读的方式,来实现你的 dup key 要求。 https://docs.python.org/3/library/collections.html#collections.defaultdict

我知道,我知道,“没有进口”; 现在介绍一个变体解决方案。


    d = {}
    with open('example.txt') as f:
        for line in f:
            word, nums = line.split(',', maxsplit=1)
            a, b, c = map(int, nums.split(','))
            delta = c - b
            key = (word, a)
            if key not in d:
                d[key] = []
            d[key].append(delta)
    return d