Python 中动态计算范围

问题描述 投票:0回答:2

我有一系列名为“x.tif”的文件,其中“x”是一个整数 我需要将这些文件分类到每个数字范围的文件夹中。

文件夹的顶层应以百万为单位,例如0-999999、1000000-1999999 下一级文件夹应该以千为单位,例如0-999、1000-1999

让我困惑的并不是Python,而是计算范围的实际数学

最终结果应该是这样的

当然,我可以使用硬编码范围来做到这一点,但我宁愿避免为每一百万中的每一千输入一个巨大的 elif 语句。

我一直在尝试使用 divmod() ,它对一千以下的数字按预期工作,但我无法弄清楚我需要做什么才能使这种动态化,因此它可以想象出输入的任何数字的范围它。

def get_number_range(file_to_move): 

    file_number = file_to_move
    try:
        mod_calc_thou = divmod(int(file_number), 1000)
    except ValueError:
        self.mission_failed(file_to_move, reason="Not a number")
        return False, False
    try: 
        mod_calc_mil = divmod(int(file_number), 1000000)
    except ValueError:
        return False, False
    thousands_range = mod_calc_thou[0] + 999
    millions_range = mod_calc_mil[0] + 9999999
    thousands_range_folder = f"{str(mod_calc_thou[0])}-{thousands_range}"
    millionsths_range_folder = f"{str(mod_calc_mil[0])}-{millions_range}"
    print(thousands_range_folder)
    print(millionsths_range_folder)

print("First")
get_number_range("530")
#Should output 0-999 and 0-999999
print("Second")
get_number_range("1842888")
#Should output, 1842000-1842999, 1000000-1999999
print("Third")
get_number_range("19874")
#Should output 19000-19999, 0-999999
python math
2个回答
2
投票

您可以使用 modulo

%
运算来计算文件编号的提醒,并减去该提醒以获得范围的基数
fi
。范围的顶部数字是
fi
+
Li
- 1。

n = 19874

L1 = 1000000  # Top-level
L2 = 1000  # Next-level

# Compute the base of the ranges
f1 = n - (n % L1)
f2 = n - (n % L2)

# Compute the whole range
r1 = f1, f1 + L1 - 1
r2 = f2, f2 + L2 - 1

print(r2, r1)

这可以很容易地适应两个以上的级别。

n = 1842888

# The levels in increasing order
levels = [1000, 1000000]

# Compute the base of the ranges
f = [n - (n % l) for l in levels]
# Compute the whole range
r = [(f, f + l - 1) for (f, l) in zip(f, levels)]

print(r)

1
投票

您可以将其变成一个通用的递归函数,该函数将支持任意数量的级别和分块大小。从完整范围开始,将其分解为块,然后使用与包含文件号的块相对应的缩小范围进行递归:

def getFolders(FN,spread=1000,levels=2,base=0, maxN=0):
    maxN   = maxN or spread**(levels+1) 
    chunk  = (maxN-base) // spread
    if chunk < spread: return [] 
    base += (FN-base) // chunk * chunk
    return getFolders(FN,spread,levels,base,base+chunk) + [f"{base}-{base+chunk-1}"]

输出:

print(getFolders(530))     # ['0-999', '0-999999']
print(getFolders(184288))  # ['184000-184999', '0-999999']
print(getFolders(19874))   # ['19000-19999', '0-999999']

print(getFolders(530,spread=100,levels=3))    
# ['500-599', '0-9999', '0-999999']

print(getFolders(184288,spread=100,levels=3)) 
# ['184200-184299', '180000-189999', '0-999999']

print(getFolders(19874,spread=100,levels=3))  
# ['19800-19899', '10000-19999', '0-999999'] 
© www.soinside.com 2019 - 2024. All rights reserved.