仅列出最具体的代码

Make A List of Only the Most Specific Codes

我有一个以嵌套结构排序的代码列表。例如,这里是前 20 个:

codes 8个 8.5 8.51 8.52 8.6 8.7 10 31 31.1 38 38.1 38.2 38.3 41 41.1 41.11 41.12 41.2 41.21 41.4

小数点越多,代码越具体。我需要找到一种方法来只列出我以粗体突出显示的最具体的代码。如果您将这些数字想象成一棵树,其中每个小数舍入级别对应树中的一个节点级别,我需要获取所有叶子。

例如,8.51 比 8.5 更具体,而 8.5 又比 8 更具体。8.6 也是叶子,因为它比 8 更具体,并且没有子节点来自它。

这是给定这 20 个代码的建议树结构图:

树形结构完全由输入数组codes定义,因为如果数组中存在数字A.abc,则A.abA.aA 也必须存在于数组中。该数组方便地升序排列。

我想要一个算法来找到这些叶子并将它们收集在 list/vector 中。谢谢!

您可以通过计算小数位数并添加小数点大于 2 的值来使用列表理解。试试这个:

lst = [8, 8.5, 8.51, 8.52, 8.6, 8.7, 10, 31, 31.1, 38, 38.1, 38.2, 38.3, 41, 41.1, 41.11, 41.12, 41.2, 41.21, 41.4]
lst2 = [i for i in lst if str(i)[::-1].find('.')>=2]

str(i)[::-1].find('.')只是获取点后的小数位数。然后,如果小数位数 >=2 或任意值

,则可以将值附加到列表中

你可以试试这个:

codes = [8.0, 8.5, 8.51, 8.52, 8.6, 8.7, 10, 31, 31.1, 38, 38.1, 38.2, 38.3, 41, 41.1, 41.11, 41.12, 41.2, 41.21, 41.4]

def to_str(num):
    s = str(num)
    if ".0" in s and s.endswith("0"):
        return str(int(num))
    else:
        return s

def is_prefix_of(a, b):
    return to_str(b).startswith(to_str(a))
    
def get_specifics(A):
    ret = []
    for i in range(len(A) - 1):
        if not is_prefix_of(A[i], A[i+1]):
            ret.append(A[i])
    ret.append(A[-1])
    return ret
    
print(get_specifics(codes))

# [8.51, 8.52, 8.6, 8.7, 10, 31.1, 38.1, 38.2, 38.3, 41.11, 41.12, 41.21, 41.4]

我假设 1) 的答案是数组始终排序,以及 2) 都使用了与存在的叶子相对应的舍入,或者可以缺少一些?例如:你总是有 8, 8.4, 8.42, 8.423 等还是你有 8, 8.4, 8.423(缺少四舍五入到百分之一)都是 YES。

OP 现已确认这些内容属实。

编辑:将 float 整数正确转换为 ints