0

我正在学习 Python 一个月,我正在尝试使用字典制作一个 keygen 应用程序。想法是将 name = input('Name: ') 中的每个字母与 dict.keys() 进行比较,并为每个等于 dict.keys() 的名称字母打印结果 dict.values()。这就是我写的:

name = input('Name: ')

kalg = dict()
kalg['a'] = '50075'
kalg['b'] = '18099'
kalg['c'] = '89885'
etc...

我试着写这个...

for x in kalg.keys():
    print(x)[/code]

...但我需要保留 print(x) 结果,但我不知道该怎么做!如果我这样做:

for x in kalg.keys():
    a = x

'a' 只保留字典的最后一个键:(。我认为这是因为 print(x) 在新行上打印 dict.keys() 的每个键,但我不知道如何解决它(我试过了转换类型等......但它没有工作)。

请问你能帮我解决这个问题吗?我也不知道如何将一个字符串的每个字母与另一个字符串进行比较,并在正确的位置打印 dict.values() 作为结果。

抱歉这个愚蠢的问题,但我对编写 python 应用程序太兴奋了 :)


@卡尔

我正在通过两本不同的书学习 Python:Mark Luts 的“Learning Python”,它涵盖了 Python 2 和一个涵盖 Python 3 的口袋。我检查了口袋一的列表理解,并设法编写了这个 keygen 的其他三个变体。现在我想问你如何在一个真实的应用程序中实现这个 keygen 的源代码,它有一个 GUI 验证 name_textbox 和 key_textbox 标题是否匹配(我来自基本,所以这是我以前写的,只是为了给你一个想法)作为keygen 输出结果。我知道我可以自己尝试做到这一点(我做过但没有成功),但我想先完成这本书(袖珍版)并了解 Python 的所有主要方面。谢谢你的耐心。

4

2 回答 2

0

我只能猜测,但这可能是你想要的:

name = input('Name: ')
kalg = {'a':'50075', 'b': '18099', 'c': '89885'}
keylist = [kalg[letter] for letter in name]
print(" ".join(keylist))
于 2011-08-14T15:30:17.040 回答
0

调用print不能“保留”任何东西(因为没有变量可以存储它),并且重复分配给变量会替换以前的分配。(我不明白你对这个问题的推理;print(x)行为方式与行为方式无关a = x,因为它们是完全不同的事情。)

您的问题归结为“我如何保留几个类似操作的一堆结果?” 在概念层面上,答案是“将它们放入容器中”。但是明确地将东西放入容器中比真正需要的更乏味。你有你想要的数据的英文描述:“dict.values() for each letter of name equal to dict.keys()”。事实上,等效的 Python 惊人地相似。

当然,我们实际上并不希望dict.values()每个匹配的字母都有单独的副本;而且我们实际上不想将字母与整个集合进行比较dict.keys()。作为程序员,我们必须更加精确:我们正在检查该字母是否是 dict 的键,即它是否在dict.keys(). 幸运的是,这个测试写起来很简单:对于给定的字母,我们检查letter in dict. 当找到字母时,我们想要对应的值;我们通过正常查找得到它,因此dict[letter].

然后我们用我们的特殊语法将这一切包装起来,给我们想要的东西:列表推导。我们把括号放在一个列表中,然后在里面写(一些从输入元素计算结果的表达式)for(输入元素的变量名,所以我们可以在第一个表达式中使用它)in(输入元素的来源); if并且我们可以通过添加(输入元素上的某些条件)同时过滤输入元素。

所以这很简单:[kalg[letter] for letter in name if letter in kalg]. 请注意,我将name其作为“元素的来源”,因为它应该是这样的。dict.keys()您在对问题的描述中完美地解释了这一点 - 为什么要在现有的 for 循环中进行迭代?:)

现在,这个表达式会给我们一个结果列表,例如 ['foo', 'bar', 'baz']。如果我们想要一个连续的字符串(我假设您的 dict 中的所有值都是字符串),那么我们需要将它们连接起来。幸运的是,这也很容易。事实上,因为我们要将结果传递给一个接受一个参数的函数,所以有一个特殊的语法规则可以让我们去掉方括号,让事情看起来更整洁一些。

它也比你一开始就初始化字典更容易;惯用的 Python 代码实际上很少需要dict.

把它们放在一起:

kalg = {'a': '50075', 'b': '18099', 'c': '89885'} # etc.
name = input('Name: ')
print(''.join(kalg[letter] for letter in name if name in kalg))
于 2011-08-14T15:42:03.057 回答