仅列出最具体的代码

2024-06-02 19:59:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

codes 8. 8.5 8.51 8.528.6 8.710 31 31.1 38 38.1 38.2 38.3 41 41.1 41.11 41.12 41.2 41.2141.4

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

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

以下是给出这20个代码的建议树结构图: enter image description here

树结构由输入数组codes完美定义,因为如果数组中存在一个数A.abc,那么A.abA.aA也必须存在于数组中。数组可以方便地按升序排序

我想要一个算法,找到这些叶子并将它们收集到一个列表/向量中。谢谢


Tags: 方法代码列表节点排序数字数组级别
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(缺少舍入到百分之一)都是肯定的

这些已经被OP证实是正确的

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

您可以通过计算小数的数量并添加小数大于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,或者您喜欢的任何数字,您可以将值附加到列表中

相关问题 更多 >