我有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(包含空格)的列表但是 我找不到错误...... 有人有提示吗?
答案 0 :(得分:1)
老实说,我不明白为什么你希望从该代码中获得完整的字母表。让我们看一下x
的单个值会发生什么。
所以x
是0
,这意味着我们将填补第一点。 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=1
和if 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 '