【问题标题】:Python syntax / understandingPython语法/理解
【发布时间】:2013-11-19 22:18:50
【问题描述】:
def counting_sort(array, maxval):
    """in-place counting sort"""
    m = maxval + 1
    count = [0] * m               # init with zeros
    for a in array:
        count[a] += 1             # count occurences
    i = 0
    for a in range(m):            # emit
        for c in range(count[a]): # - emit 'count[a]' copies of 'a' #CONFUSED
            array[i] = a
            i += 1
    return array

print counting_sort( [1, 4, 7, 2, 1, 3, 2, 1, 4, 2, 3, 2, 1], 7 )
#            prints: [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 4, 7]

所以在上面的代码中,我不理解我用混淆标记的行,最后一行之前的 4 行。 可能是因为我是 python 新手或者只是愚蠢。

  1. 第一种情况发生了什么?当范围是 [ ] ? ... "对于空数组范围内的每个 c....?
  2. 我也没有得到array[i] = a 在下面的行。如果 a 是计数数组中可能为零的第一个元素,那么如何添加它......?真是一头雾水……

干杯!

【问题讨论】:

    标签: python algorithm sorting counting


    【解决方案1】:

    您显然已经发现 count[a] 将是 0,因此 range(count[a]) 将是 []

    所以,你要问的是,这是做什么的:

    for i in []:
       do_stuff(i)
    

    答案是它循环遍历 0 个元素中的每一个——换句话说,它根本不循环。它什么都不做。*

    the for statement 的文档中对此进行了解释:

    ...然后,对于迭代器提供的每个项目,该套件都会执行一次... 当项目用尽时(即序列为空时立即...) ...循环终止。


    这隐含地解释了你的第二点困惑:

    如果a是计数数组中第一个可能为零的元素,如何添加它

    count[a] 为0 时,您将永远不会进入循环,因此这种情况永远不会出现。


    * 如果for 语句有else 子句,它会运行else 子句。

    【讨论】:

      【解决方案2】:
      1. range 会给你一个指定开始和结束值的列表。例如

        print range(5) 
        

        将打印

        [0, 1, 2, 3, 4]
        

        当您说range(m)range(count[a]) 时,它将生成一个列表,直到mcount[a] 从0 开始。

      2. 关于array[i] = a

        range(m) 中,对于每个元素,代码都会检查count[a]。如果count[a] 为0,则不会执行第二个循环。 (range(0) 将产生一个空列表)所以,当a 为 0 时,array[i] = a 将不会被执行。

      【讨论】:

        【解决方案3】:

        我简化了你的部分代码,也许它可以帮助你更好地理解算法的核心。在计算完数组中的所有元素后,我们可以只用count[]中存储的信息重构一个排序后的数组。

        array=[]
        for a in range(m): 
            array.extend([a]*count[a])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-28
          • 1970-01-01
          • 1970-01-01
          • 2019-11-26
          • 1970-01-01
          • 2021-08-22
          • 2023-01-02
          相关资源
          最近更新 更多