仅列出最具体的代码
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.ab
、A.a
、A
也必须存在于数组中。该数组方便地升序排列。
我想要一个算法来找到这些叶子并将它们收集在 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
。
我有一个以嵌套结构排序的代码列表。例如,这里是前 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.ab
、A.a
、A
也必须存在于数组中。该数组方便地升序排列。
我想要一个算法来找到这些叶子并将它们收集在 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
。