需要帮助来编写价值来自文件的字典

时间:2018-08-18 23:13:02

标签: python tkinter

我需要创建一个字典,在其中使用for循环创建密钥,然后从文件中获取每个密钥的值。

我的文本文件在12 x 12的表格中各有一行。

“我一直吃着,直到我在地板上生病为止,8 x 8是64。”

我觉得在txt文档中编写这样的韵律比在python程序中编写韵律要好。

然后我想制作一个字典,其中的键遵循以下结构:8 x 8 = 64

值就是整个句子:“我一直吃着,直到我在地板上生病为止,8 x 8是64。”

为了提供进一步的信息,我基本上列出了一个游戏的错误答案,该错误答案的结构如下:8 x 8 = 64(如上所述)。该列表包含在tkinter的列表框中。到目前为止,我已经有了我的程序,无论用户何时选择一个项目,都可以将列表框中的当前选择打印到控制台上。 2 x 2 =4。

我想拥有它,以便当他们从列表旁边选择特定问题/关键(例如8 x 8 = 64)时,标签会更改为该问题/关键的值,例如“我一直吃着,直到我在地板上生病为止,8 x 8是64。”

这将为他们提供帮助,以便在以后尝试游戏时记住正确的答案。

下面显示了到目前为止的代码,但我又被卡住了! :(

d = {}
with open('help.txt', 'r') as f:
    for line in f:
        val = line
        for i in range (1,13):
            for n in range (1,13):
                answer = n * i
                key = '{} x {} = {}'.format(n, i, answer)
            d [key] = val

我希望我能清楚地解释我的问题。我也乐于尝试其他方式。

2 个答案:

答案 0 :(得分:1)

您的代码的基本问题是嵌套循环。用英语,您的程序读取如下内容:

  

对于文件中的每一行,请检查数字的每种组合,然后将其添加到字典中。

这显然不是您想要的。您需要文件中每行一个数字或一对数字。在当前版本中,最终要遍历每一行的所有键,并覆盖现有值。您的字典具有所有正确的键,但是所有值自然都是文件中的最后一行。

这是初学者的常见问题。解决方案是让一个循环遍历您的数字和 lockstep 中的文件。

首先让我们看一个简单的案例,只涉及NxN个押韵。有两种基本的实现方法。第一个使用enumerate函数:

for n, val in enumerate(f, start=1):
    key = '{} x {} = {}'.format(n, n, n * n)
    d[key] = val

enumerate遍历任何可迭代对象(例如文件),并在每一步产生一个计数器。在锁步中迭代两个序列的另一种更通用的方法是使用zip

for n, val in zip(range(1, 13), f):
    key = '{} x {} = {}'.format(n, n, n * n)
    d[key] = val

您的代码中也存在一些小问题。例如,行val = line完全没有用。字符串是不可变的对象,赋值不会复制该对象,只是对其进行新引用。您可以完全摆脱那条线。如果要将字典值称为val,只需将外门循环写为for val in f

答案 1 :(得分:0)

您可以使用itertools.product(对于笛卡尔积)使用单个for循环来执行此操作。

for line, (x, y) in zip(f, product(range(1, 13), range(1, 13))):
    ...

您甚至可以通过dict理解来完成整件事

from itertools import product
with open(help.txt) as f:
    d = {f"{x} x {y} = {x*y}": line.rstrip()
         for line, (x, y) in zip(f, product(range(1, 13), range(1, 13)}

这是假定.txt文件中的行与产品返回的顺序相同。

请考虑从.txt文件中读取数字,而不是通过编程方式生成数字。这样,他们一定会正确匹配。您可以使用str.split()方法分割一行文本。另请参见csv模块。 .csv格式非常简单,可以手工编写,也可以从电子表格程序(如Excel或LibreOffic Calc)中导出。


好的,这是一种更简单的方法。由于您的值将是单行字符串,因此您可以像这样简单地在.txt文件中替换键,值行。

8 x 8 = 64
I ate and I ate until I was sick on the floor, 8 x 8 is 64.
6 x 6 = 36
6 times 6 is 36, now go outside to pick up sticks.

您可以将其读入dict这样的字典中,

d = {}
with open('help.txt', r) as f:
    itf = iter(f.read().splitlines())
    for line in itf:
        d[line] = next(itf)

.read()方法将立即以字符串形式读取整个文件,然后.splitlines()会将其拆分为行列表(无'\n')。 iter()函数将在for循环开始之前获取迭代器(由于迭代器本身是可迭代的,因此for循环仍可使用),而next()函数将从迭代器中获取下一项。每个循环可以读取两行。