【问题标题】:Python 3.x dictionary-based keygen help?Python 3.x 基于字典的 keygen 帮助?
【发布时间】:2011-08-14 14:58:07
【问题描述】:

我正在学习 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 的所有主要方面。感谢您的耐心等待。

【问题讨论】:

    标签: python algorithm dictionary key-generator


    【解决方案1】:

    调用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 作为“元素的来源”,因为它应该是这样的。您在对问题的描述中非常清楚地解释了这一点 - 为什么要在现有的 for 循环中迭代 dict.keys()? :)

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

    这也比你一开始就初始化 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))
    

    【讨论】:

    • 非常感谢您的回答,现在它正在工作,但我不明白为什么如果我输入 print("".join(kalg[LETTER] 任何字母(我输入 'a'示例)输出显示每个名称字母的每个值...我希望它只会为名称中的每个“a”显示“a”值(我希望你能明白,因为我的英语说得不太好)。跨度>
    • 因为名称中的每个字母都是letter in name,即使您之前已经看过。
    • 我还有一个问题(我把它放在帖子的末尾)。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      • 2014-04-09
      • 2010-11-14
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      相关资源
      最近更新 更多