繁体   English   中英

Python语法/理解

[英]Python syntax / understanding

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是计数数组中的第一个元素(可能为零),如何将其添加....? 真的很困惑...

干杯!

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

因此,您要问的是,这是做什么的:

for i in []:
   do_stuff(i)

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

这在文档中针对for语句进行了说明

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


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

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

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


*如果for语句具有else子句,则它将运行else子句。

  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将不会执行。

我简化了部分代码,也许它可以帮助您很好地理解算法的核心。 在对数组中的所有元素进行计数之后,我们只能使用存储在count[]的信息来重建排序后的数组。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM