【问题标题】:Printing a histogram打印直方图
【发布时间】:2011-12-20 14:23:03
【问题描述】:

我有一个整数百分比列表,我需要使用以下模式打印:

The index of a value, a tab (8 spaces), a '*' printed for each percentage point

如果索引的值为 0,则打印“小于 1%”

我试过这段代码:

for b in new_tally:
    if b > 0:
        print new_tally[b], \t, '*' * b
    else:
        print 'Less than 1% of words had this length'

但是我不断收到错误代码:列表索引超出范围。

我完全不明白,谁能指出我做错了什么?

【问题讨论】:

  • print b-1, '*' * b,也许吧?
  • 如果某些花哨的东西不适合您,请逐步进行。只需输入 b,或者直接打印 new_tally 看看你会得到什么。
  • 你必须区分列表索引和列表内容。说如果你有lst = [5, 7, 8, 6, 4, 2]for b in lst: print b 将打印 lst 的内容,而不是索引。所以第三个你会得到 8 个。你再次使用这个 8 作为 lst[b] 的索引,那么列表中的第 8 个元素就没有了

标签: python list indexing histogram traceback


【解决方案1】:

我认为你想要的代码是:

>>> new_tally = [5, 7, 8, 6, 4, 2]
>>> for i, b in enumerate(new_tally, 1):
        print i, ':', b, '*' * b

1 : 5 *****
2 : 7 *******
3 : 8 ********
4 : 6 ******
5 : 4 ****
6 : 2 **

原始回溯的原因是使用方括号而不是圆括号查找列表成员。 new_tally(i) 是一个函数调用。 new_tally[i] 是索引查找。

【讨论】:

  • 不是先打印值,然后打印相应的 * 数,您建议如何编辑它以便打印值的索引 + 1,然后打印 * 的数量。我想这样做,因为它会列出单词长度,然后是百分比。这是因为在我的情况下,字长总是比索引大一,因为索引从索引开始,字长从 1 开始。感谢您的帮助:)
  • 编辑了示例以展示如何使用 enumerate() 来索引从 1 开始的 bin。
【解决方案2】:
for key,val in new_tally.iteritems():
    print('{k} {a}'.format(k=key,a='*'*int(val)))

或者,如果您希望直方图按频率降序排序:

import operator
for key,val in sorted(new_tally.items(),key=operator.itemgetter(1),reverse=True):
    print('{k} {a}'.format(k=key,a='*'*int(val)))

【讨论】:

    【解决方案3】:

    第一件:

    new_tally = [5, 7, 8, 6, 4, 2]
    for b in new_tally:
        print b
    

    第二件:

    new_tally = [5, 7, 8, 6, 4, 2]
    for i in range(len(new_tally)):
        print i, new_tally[i]
    

    以上两个做的事情大致相同。您在按顺序访问元素(第一种方法)与按顺序索引访问列表元素(第二种方法)之间混淆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-26
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      相关资源
      最近更新 更多