【问题标题】:Python alphabet list not correctPython 字母表不正确
【发布时间】:2013-11-28 15:52:56
【问题描述】:

我有 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 的列表(包含空格),但 我找不到错误... 有人有提示吗?

【问题讨论】:

  • 你能告诉我们avgaverage列表是什么样的吗?
  • 您对列表的实际期望是什么,以及如何使用该代码?
  • 平均是 [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] 和平均 ist [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] 我希望我得到一个 ['a','b','c',.....'y ','z',' '] 我正在学习媒体计算机科学,循环工作了一段时间,在某些时候它给出了疯狂的列表。
  • 嗨@JohnA!欢迎来到 StackOverflow。我已更改您的帖子以显示您所说的平均值和平均值以及字母表的值,但生成的代码并未显示您所说的内容。您可以编辑和更新自己的帖子,这样做是为了向我们展示您实际使用的值。
  • @JohnA 您的问题缺少的是为什么。正如至少一个答案所证明的那样,有一些简单的方法可以将字母表作为字符列表。很难从这个问题中看出为什么要通过这些圈子在字母表末尾附加一个空格。

标签: python list for-loop


【解决方案1】:

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

所以x0,这意味着我们将填补第一个位置。 averageavg 倒序排列;而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。现在在avg 中只有一个位置17 出现,即索引y=1。所以循环的内部部分只对x=0y=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] 的值出现非唯一时,情况会变得更加复杂。在这种情况下,字母字符会被多次覆盖。

【讨论】:

    【解决方案2】:

    为了得到a-z的结果,avg需要经过反转排序后与average相同,并且它们的所有值都需要唯一。

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

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

    (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】:

      好吧,我不知道你想用这段代码完成什么,但很容易弄清楚为什么你会得到你得到的结果。只需单步执行代码!排序后,你有这个:

      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] 的最终值。

      等等等等。我可以看到这里没有什么令人惊讶的 - 代码正在做你告诉它做的事情。

      【讨论】:

        【解决方案4】:

        如果你想轻松得到一个从 a 到 z 的列表,Python 已经给你了:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-24
          • 1970-01-01
          • 2017-09-04
          • 1970-01-01
          • 1970-01-01
          • 2021-12-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多