Python 3.基于X字典的keygen帮助



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

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

我试着写这个…

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

…但我需要保持打印(x)结果,但我不知道如何做到这一点!如果我这样做:

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

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

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

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


@卡尔

我正在通过两本不同的书学习Python: Mark Luts的《Learning Python》,其中涵盖了Python2和一个包含Python 3的口袋。我检查了列表理解ón口袋之一,并设法编写了这个密钥的其他三个变体。现在我想问你我怎么能实现这个keygen的源代码在一个真实的应用程序与GUI验证如果name_textbox和key_textbox标题匹配(我来自基本,所以这是我用来写的,只是给你一个想法)作为keygen输出结果。我知道我可以尝试自己做这件事(我做过,但没有成功),但我想先完成这本书(袖珍本)并了解Python的所有主要方面。谢谢您的耐心等待。

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

你的问题归结为"我如何保存几个类似操作的一堆结果?"在概念层面上,答案是"将它们放入容器中"。但是,显式地将内容放入容器中是非常繁琐的,而不是真正必要的。您拥有所需数据的英文描述:"名称的每个字母对应的dict.values()等于dict.keys()"。实际上等价的Python是惊人的相似。

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

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

很简单:[kalg[letter] for letter in name if letter in kalg]。注意,我有name作为"元素的来源",因为它应该是这样的。你在对问题的描述中非常清楚地解释了这一点——为什么你要在现有的for循环中迭代dict.keys() ?:)

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

初始化字典也比初始化简单得多;习惯的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))

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

name = input('Name: ')
kalg = {'a':'50075', 'b': '18099', 'c': '89885'}
keylist = [kalg[letter] for letter in name]
print(" ".join(keylist))

相关内容

  • 没有找到相关文章

最新更新