Python字母表列表不正确

时间:2013-11-28 15:52:57

标签: python list for-loop

我有2个带有整数的Python列表(平均值和平均值)。平均值按顺序排序。 Alphabet只是一个带有字母a-z的列表,最后一个元素是表示空格的空字符串。平均值是文本文件的字母频率。我正在尝试使用替换密码来为我的学习工作。

average = [1, 17, 11, 2, 0, 4, 0, 5, 2, 6, 0, 4, 1, 1, 3, 1, 3, 2, 1, 0, 6, 5, 0, 1, 0, 7, 5]
alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' ']

avg = average[:]
average.sort(reverse = True)

for x in range(27):
  for y in range(27):
    if average[x] == avg[y]:
      if y < 26:
        alphabet[x] = chr(97 + y) # ASCII a = 97 
      else:
        alphabet[x] = chr(32) # 32 = space

print(alphabet)

出于某种原因,我把它作为输出:

['b', 'c', 'z', 'u', 'u', ' ', ' ', ' ', 'l', 'l', 'q', 'q', 'r', 'r', 'r', 'x', 'x', 'x', 'x', 'x', 'x', 'y', 'y', 'y', 'y', 'y', 'y']

通常应该是从a到z(包含空格)的列表但是 我找不到错误...... 有人有提示吗?

4 个答案:

答案 0 :(得分:1)

老实说,我不明白为什么你希望从该代码中获得完整的字母表。让我们看一下x的单个值会发生什么。

所以x0,这意味着我们将填补第一点。 average的排序顺序为avg;而avg是一个看似无关的数字列表。这就是x = 0

的情况
for y in range(27):
    if average[x] == avg[y]:
        if y < 26:
            alphabet[x] = chr(97 + y) # ASCII a = 97 
        else:
            alphabet[x] = chr(32) # 32 = space

average[x]是最大的数字17。现在只有17 avg出现y=1的单个地点,即索引x=0。因此,循环的内部部分仅对y=1if y < 26: alphabet[x] = chr(97 + y) # ASCII a = 97 else: alphabet[x] = chr(32) # 32 = space 执行一次:

y=1

现在26明显小于x=0,因此第一种情况适用,在这种情况下,索引chr(97 + 1)处字母的字符将为a。这不是您在输出中显然预期的x

对于其他average[x],这些事情也会发生类似情况,只有当{{1}}的值出现并且不唯一时,它会变得更加复杂。在这种情况下,字母字符会被多次覆盖。

答案 1 :(得分:0)

好吧,我不知道你用这个代码想要完成是什么,但是很容易找出你获得结果的原因。只需单步执行代码!排序后,你有这个:

average = [17, 11, 7, 6, 6, 5, 5, 5, 4, 4, 3, 3,
           2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
avg =     [1, 17, 11, 2, 0, 4, 0, 5, 2, 6, 0, 4,
           1, 1, 3, 1, 3, 2, 1, 0, 6, 5, 0, 1, 0, 7, 5]

现在你的循环开始查看average[0],这是17. avg[y] == 17 y=1唯一的索引。所以你的代码确实:

 alphabet[x] = chr(97 + y) # ASCII a = 97

是:

 alphabet[0] = chr(97 + 1)

是:

 alphabet[0] = chr(98)

是:

 alphabet[0] = 'b'

您已完成外循环的第一次迭代,因此alphabet[0] == 'b'是分配给alphabet[0]的最终值。

Etc等等。我在这里看到的并不奇怪 - 代码正在按照你的要求去做。

答案 2 :(得分:0)

为了获得a-z,avg在翻转和排序后需要与average相同,并且所有值都必须是唯一的。

如果alphabet列表中的位置0等于'a',则需要x,y对(0,0)。

这意味着对于以下average[x] == avg[y]对,x,y必须为true:

(0, 0)
(1, 1)
(2, 2)
(3, 3)
(4, 4)
(5, 5)
(6, 6)
(7, 7)
(8, 8)
(9, 9)
(10, 10)
(11, 11)
(12, 12)
(13, 13)
(14, 14)
(15, 15)
(16, 16)
(17, 17)
(18, 18)
(19, 19)
(20, 20)
(21, 21)
(22, 22)
(23, 23)
(24, 24)
(25, 25)
(26, 26)

鉴于您的代码,您可以获得a-z的average值为:

average = [27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

总结

至于魔法最初使该循环产生a-z,我怀疑现在的行如下:

if average[x] == avg[y]:

最初可能是这样读的:

if x == y:

在这种情况下你可以完全抛出任何输入,并且它会快乐地产生所需的a-z。

答案 3 :(得分:-1)

如果您想轻松地从a到z获取列表,Python已经为您提供了一个:

>>> from string import ascii_lowercase
>>> alphabet = ascii_lowercase + ' '
>>> alphabet
'abcdefghijklmnopqrstuvwxyz '