你如何比较 Python 中写成字符串的数字区间?

How do you compare number intervals, written as strings, in Python?

对于我正在处理的这个数据文件,我得到了一对列表,其中每个元素代表一个年龄间隔,但它们被写为字符串。例如,

List1 = ['0-9', '10-19', '20-29', '30-39', '40-49', '50-']

List2 = ['0-19', '20-39', '40-']

以List1为模板表示对应数据的年龄区间:

A1 = [30, 40, 50, 60, 70, 80]

B1 = [33, 20, 40, 76, 777, 844]

因此,例如,A1 的第二个元素表示年龄区间“10-19”的值为 40,B1 的第五个元素表示年龄区间“40-49”的值为 777。

由于 List1 与 List2 中的时间间隔匹配,因此可以对 A1 和 B1 中的元素求和,以便它们现在代表 List2 的时间间隔。

A2 = [70, 110, 150]

B2 = [53, 116, 1621]

现在,例如,A2 的第二个元素(以前是 A1)表示年龄区间“20-39”的值 110,B2 的第一个元素(以前是 B2)表示年龄区间“0”的值 53 -19'.

List1 的数据已重新分类以匹配 List2 的年龄间隔。这是可能的,因为重叠的年龄间隔。对于代表以下两个年龄段的数据不能这样做:

List3 = ['0-14', '15-29', '30-44', '45-']

List4 = ['0-19', '20-39', '40-']

由于数据格式的原因,我不知道如何检查两个列表是否具有重叠的年龄间隔,这允许重新分类数据以表示一组新的年龄间隔。如果有人能向我指出 python 中可用的方法或库,能够使这样的任务成为可能,特别是处理以字符串表示的数字间隔,我将不胜感激。谢谢。

我们可以使用split方法从'0-9'('0', '19')。 将此方法应用于所有对可能如下所示:

list1 = [s.split('-') for s in list1]
list2 = [s.split('-') for s in list2]

现在我们需要迭代 list1 以两两合并对。 我使用 zip 函数来做到这一点。

merge = [[pair[0][0], pair[1][1]] for pair in list(zip(list1,list1[1:]))[::2]]

然后我们只需要将新的 merge 列表与 list2.

进行比较
merge == list2

一切都在一起:

def foo(list1, list2):
    list1 = [s.split('-') for s in list1]
    list2 = [s.split('-') for s in list2]
    merge = [[pair[0][0], pair[1][1]] for pair in list(zip(list1,list1[1:]))[::2]]
    return merge == list2

print(foo(List1, List2)) # True
print(foo(List3, List4)) # False

您可以在一组 set 中挑选出所有年龄较小的,在另一组中挑选出所有年龄较大的。然后查看较短列表中的所有年龄较大的人是否都存在于较长列表中的 older 中,而较年轻的人是否也存在。 这样,它不仅会匹配成对,还会匹配单数、成对、三胞胎等的任意组合。

def can_represent(short_list, long_list):
    youngs_1 = {s.split('-')[0] for s in short_list}
    youngs_2 = {s.split('-')[0] for s in long_list}
    olds_1 = {s.split('-')[1] for s in short_list}
    olds_2 = {s.split('-')[1] for s in long_list}
    return not youngs_1 - youngs_2 and not olds_1 - olds_2