【问题标题】:How do you compare number intervals, written as strings, in Python?您如何比较 Python 中以字符串形式编写的数字区间?
【发布时间】:2020-11-17 03:51:54
【问题描述】:

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

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-19”的 53 '。

List1 的数据已重新组合以匹配 List2 的年龄区间。这是可能的,因为重叠的年龄间隔。这不能用于表示以下两个年龄区间的数据:

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

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

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

【问题讨论】:

  • 您可以通过'0-9'.split('-')'0-9' 分隔成('0', '9')。这可能是你的起点。但我不明白你的情况的检查规则。你能解释一下细节吗?
  • 感谢您的评论。我将尝试更清楚地解释细节:每个列表都包含年龄间隔,如上所示。但是,对于我提供的每个列表,都有另一个列表与相应年龄间隔的数据相关联。因为可以对 List1 的元素求和以表示 Lists2 的年龄区间,所以 List1 的另一组数据也可以求和以匹配 List2 的年龄区间。 List3 和 List4 表示无法重新组合这些列表的其他数据的情况。
  • "如果 List1 的元素可以相加来表示 List2。"我不明白这是什么意思。这里的底层逻辑是什么?
  • @BoseongChoi 我已经更新了我的问题。如果有人仍然不清楚,请告诉我。谢谢。
  • @KarlKnechtel 如果问题现在清楚,请告诉我。谢谢。

标签: python module intervals


【解决方案1】:

我们可以使用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

【讨论】:

  • 不需要转换为int。不需要转换为元组:list1 = [s.split('-') for s in list1] \\ list2 = [s.split('-') for s in list2] \\ merge = [[pair[0][0], pair[1][1] if pair[1][1] else ''] for pair in list(zip(list1,list1[1:]))[::2]] \\ return merge == list2
  • 确实!在我的研究中的某个时刻,我试图总结这些对,我迷失了自我……感谢您指出这一点!我已经编辑了我的答案
  • 然后也可以去掉merge = [[pair[0][0], pair[1][1]] for pair in list(zip(list1,list1[1:]))[::2]]中的if else
  • 又是一次好球!
【解决方案2】:

您可以在一个set 中整理出所有较年轻的年龄,并在另一组中整理出所有较旧的年龄。然后查看较短列表中的所有较旧年龄是否存在于较长列表中的较旧中,对于较年轻的列表是否相同。 这样,它不仅匹配对,而且匹配单、对、三胞胎等的任何组合。

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

【讨论】:

  • 感谢您的回答 Jolbas,我喜欢这种替代方法
  • @user9977 如果还有其他年龄范围组合而不是对,则此函数返回 true。例如 0-9、10-19、20-29、30-39、40- 匹配 0-9、10-39、40-
猜你喜欢
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多