为了账号安全,请及时绑定邮箱和手机立即绑定

将最大数字放在列表的第一个位置时未给出正确答案

将最大数字放在列表的第一个位置时未给出正确答案

繁花不似锦 2023-10-26 17:04:39
PyMuPDF 的下一版本将支持提取音频注释。使用此脚本使用 PyMuPDF 从 PDF 中提取音频注释,它很容易使用,只需调用该脚本并将 PDF 文件作为第一个参数传递即可:python script.py myfile.pdf注意:仅适用于 Windows。import fitz, sys, os, subprocessassert len(sys.argv) == 2, "need filename as parameter"ifile = sys.argv[1]doc = fitz.open(ifile)ofolder = os.path.dirname(ifile)if ofolder == "":    ofolder = os.getcwd()flnm = os.path.splitext(os.path.basename(ifile))[0]defolder = ofolder + "\\" + flnmos.mkdir(defolder)defolder = defolder + "\\" + flnmfor page in doc:    print(page)    annotNumber = 1    for annot in page.annots(types=[fitz.PDF_ANNOT_SOUND]):          try:             sound = annot.soundGet()          except Exception as e:            print(e)            continue        for k, v in sound.items():            print(k, "=", v if k != "stream" else len(v))        ofile = defolder + ".page." + str(page.number) + ".annot." + str(annotNumber) + ".raw"        fout = open(ofile,"wb")         fout.write(sound["stream"])        fout.close()        ofileffmpeg = defolder + ".page." + str(page.number) + ".annot." + str(annotNumber) + ".mp3"        annotNumber += 1        if "channels" in sound:            channels = str(sound["channels"])        else:            channels = "1"        if "encoding" in sound:            if sound["encoding"] == "Signed":                encoding = "s"            else:                encoding = "u"        else:            encoding = "u"        if "bps" in sound:            fmt = encoding + str(sound["bps"]) + "be"        else:            fmt = encoding + "8"        subprocess.call(['ffmpeg', '-hide_banner', '-f', fmt, '-ar', str(sound["rate"]), '-ac', channels, '-i', str(ofile), str(ofileffmpeg)], shell=True)分享编辑跟随
查看完整描述

2 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

首先将largest和设置second_largest为最大元素值(在本例中为第一个):


largest = nums[0]

second_largest = nums[0]

不幸的是,这意味着表达式:


nums[i] > largest

nums[i] > second_largest

永远不会成立,因此second_largest永远不会改变其初始(最大)值。


如果您仍然想使用当前的方法,这会更好:


def get_second_largest(nums):

    # Return none if list not big enough.


    if len(nums) < 2: return None


    # Get largest and second largest from first two (possible swap).


    largest = nums[0]

    second_largest = nums[1]

    if largest < second_largest:

        (largest, second_largest) = (second_largest, largest)


    # Process all others.


    for i in range(2, len(nums)):

        if nums[i] > largest:

            (second_largest, largest) = (largest, nums[i])

        elif nums[i] > second_largest:

            second_largest = nums[i]

    return second_largest


print(f"Second largest number is {get_second_largest([8,11,29,25,76,12])}")

除了初始化方式(从前两个元素而不仅仅是第一个元素)之外,该函数中的大部分代码都是相同的。


当然,更Pythonic的方式是:


def get_second_largest(nums):

    # None if too small, else second last element of sorted items.


    if len(nums) < 2: return None

    return sorted(nums)[-2]

如果您正在学习算法,那么冗长的方法可能会更好。但是,如果您的目标是学习Python,那么这个较短的版本更好,因为通常最好只使用该语言的各个方面,使您的生活变得更加轻松。


而且,顺便说一句,您可能需要考虑列表上下文中第二大的含义[3, 3, 2, 1](例如)。


您当前的代码(因此也是我的代码)指出这3是第二大的,但这可能不一定是最好的定义 - 它可以被认为是2(第二大值(没有重复)而不是第二大项) 。并不是说任何一种方法都是正确的方法,只是说您可能需要考虑它。


如果这是您要使用的第二大的定义,则只需使用预先删除重复项的集合即可进行轻微修改:


def get_second_largest_no_dupes(nums):

    # De-dupe, then None or second last sorted element.


    num_set = set(nums)

    if len(num_set) < 2: return None

    return sorted(num_set)[-2]


查看完整回答
反对 回复 2023-10-26
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

当最大的数字位于第一位时,您的代码将不执行任何操作。只需将 3d 线更改为:


second_largest = 0

完整代码:


def get_second_largest(nums):

    largest = nums[0]

    second_largest = min(nums)

    for i in range(1, len(nums)):

        if nums[i] > largest:

            second_largest = largest

            largest = nums[i]

        elif nums[i] > second_largest:

            second_largest = nums[i]

    return second_largest

my_nums = [100,8,11,29,25,76,12]

second_largest = get_second_largest(my_nums)

print("Second largest number is,",second_largest)


76


查看完整回答
反对 回复 2023-10-26
  • 2 回答
  • 0 关注
  • 69 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信