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

PyMuPDF 的下一版本将支持提取音频注释。使用此脚本使用 PyMuPDF 从 PDF 中提取音频注释,它很容易使用,只需调用该脚本并将 PDF 文件作为第一个参数传递即可:python script.py myfile.pdf


注意:仅适用于 Windows。


import fitz, sys, os, subprocess

assert 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 + "\\" + flnm

os.mkdir(defolder)

defolder = defolder + "\\" + flnm

for 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)

分享

编辑

跟随


繁花不似锦
浏览 106回答 2
2回答

DIEA

首先将largest和设置second_largest为最大元素值(在本例中为第一个):largest = nums[0]second_largest = nums[0]不幸的是,这意味着表达式:nums[i] > largestnums[i] > second_largest永远不会成立,因此second_largest永远不会改变其初始(最大)值。如果您仍然想使用当前的方法,这会更好:def get_second_largest(nums):&nbsp; &nbsp; # Return none if list not big enough.&nbsp; &nbsp; if len(nums) < 2: return None&nbsp; &nbsp; # Get largest and second largest from first two (possible swap).&nbsp; &nbsp; largest = nums[0]&nbsp; &nbsp; second_largest = nums[1]&nbsp; &nbsp; if largest < second_largest:&nbsp; &nbsp; &nbsp; &nbsp; (largest, second_largest) = (second_largest, largest)&nbsp; &nbsp; # Process all others.&nbsp; &nbsp; for i in range(2, len(nums)):&nbsp; &nbsp; &nbsp; &nbsp; if nums[i] > largest:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (second_largest, largest) = (largest, nums[i])&nbsp; &nbsp; &nbsp; &nbsp; elif nums[i] > second_largest:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; second_largest = nums[i]&nbsp; &nbsp; return second_largestprint(f"Second largest number is {get_second_largest([8,11,29,25,76,12])}")除了初始化方式(从前两个元素而不仅仅是第一个元素)之外,该函数中的大部分代码都是相同的。当然,更Pythonic的方式是:def get_second_largest(nums):&nbsp; &nbsp; # None if too small, else second last element of sorted items.&nbsp; &nbsp; if len(nums) < 2: return None&nbsp; &nbsp; return sorted(nums)[-2]如果您正在学习算法,那么冗长的方法可能会更好。但是,如果您的目标是学习Python,那么这个较短的版本更好,因为通常最好只使用该语言的各个方面,使您的生活变得更加轻松。而且,顺便说一句,您可能需要考虑列表上下文中第二大的含义[3, 3, 2, 1](例如)。您当前的代码(因此也是我的代码)指出这3是第二大的,但这可能不一定是最好的定义 - 它可以被认为是2(第二大值(没有重复)而不是第二大项) 。并不是说任何一种方法都是正确的方法,只是说您可能需要考虑它。如果这是您要使用的第二大的定义,则只需使用预先删除重复项的集合即可进行轻微修改:def get_second_largest_no_dupes(nums):&nbsp; &nbsp; # De-dupe, then None or second last sorted element.&nbsp; &nbsp; num_set = set(nums)&nbsp; &nbsp; if len(num_set) < 2: return None&nbsp; &nbsp; return sorted(num_set)[-2]

慕雪6442864

当最大的数字位于第一位时,您的代码将不执行任何操作。只需将 3d 线更改为:second_largest = 0完整代码:def get_second_largest(nums):&nbsp; &nbsp; largest = nums[0]&nbsp; &nbsp; second_largest = min(nums)&nbsp; &nbsp; for i in range(1, len(nums)):&nbsp; &nbsp; &nbsp; &nbsp; if nums[i] > largest:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; second_largest = largest&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; largest = nums[i]&nbsp; &nbsp; &nbsp; &nbsp; elif nums[i] > second_largest:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; second_largest = nums[i]&nbsp; &nbsp; return second_largestmy_nums = [100,8,11,29,25,76,12]second_largest = get_second_largest(my_nums)print("Second largest number is,",second_largest)76
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python