【问题标题】:Try to find a sublist that doesnt occur in the range of ANY of the sublists in another list尝试查找不在另一个列表中的任何子列表范围内的子列表
【发布时间】:2022-12-03 01:16:42
【问题描述】:
enhancerlist=[[5,8],[10,11]]
TFlist=[[6,7],[24,56]]

我有两个列表列表。我试图隔离我的“TFlist”中不适合任何增强列表子列表范围的子列表(按范围:TFlist 子列表范围适合增强列表子列表范围内)。 因此,例如,TFlist[1] 不会出现在 enhancerlist 中任何子列表的范围内(而 TFlist [6,7] 适合 [5,8] 的范围内),所以我希望将其作为输出:

TF_notinrange=[24,56]

像这样的嵌套 for 循环的问题:

while TFlist:
   TF=TFlist.pop()
   for j in enhancerlist: 
       if ((TF[0]>= j[0]) and (TF[1]<= j[1])):
           continue
           
       else: 
           TF_notinrange.append(TF)
 

是我得到这个作为输出: [[24, 56], [3, 4]]

if 语句一次检查 enhancerlist 中的一个子列表,因此即使稍后有一个子列表在其范围内,也会附加 TF。

我能以某种方式对条件进行 while 循环吗?虽然看起来我仍然有嵌套循环错误地附加东西的问题?

【问题讨论】:

  • 一个普通的嵌套 for 循环在这里更合适。对于TFlist 中的每个范围,遍历enhancerlist 中的每个范围并进行检查。如果 TFlist 对一直通过内部循环,那么您已经找到了一个有效的对,因此将它添加到另一个跟踪有效对的列表。
  • 您的代码的问题在于,您假设如果来自TFlist 的给定对与enhancerlist 中的给定对j 不重叠,您将继续添加不正确的TFlist 项目假设。您必须将每个 TFlist 与每个 enhancerlist 进行比较,然后才能得出给定的 TFlist 项目不重叠的结论。
  • 答案已发布后,您无法编辑问题以更改上下文。
  • @ddejohn 伙计。我已经说过这是我问题中的问题。如果您不喜欢这个问题 -1 ????
  • @ddejohn 那是我的原始代码!我发帖的时候出错了。离开这里。你是个巨魔

标签: python


【解决方案1】:

您可以使用嵌套的 for 循环来解决这个问题。

当前,如果 TF 不适合 enhancerlist 中当前子列表的范围,则您正在将 TF 附加到 TF_notinrange。您应该改为检查TF 是否适合enhancerlist 中的任何子列表的范围。

这是您可以执行此操作的一种方法:

enhancerlist = [[5,8],[10,11]]
TFlist = [[6,7],[24,56]]
TF_notinrange = []

for TF in TFlist:
  in_range = False
  for j in enhancerlist:
    if ((TF[0]>= j[0]) and (TF[1]<= j[1])):
      in_range = True
      break

  if not in_range:
    TF_notinrange.append(TF)

print(TF_notinrange)

这应该输出[[24, 56]]

希望这可以帮助!

【讨论】:

  • 您的代码可以通过解包 for 循环声明中的列表来改进,例如for tf_a, tf_b in TFlist; for enhancer_a, enhancer_b in enhancerlist
【解决方案2】:

替代方法是使用列表理解:

TF_notinrange = [tf for tf in TFlist 
                 if all(tf[0] < istart or tf[1] > iend 
                        for istart, iend in enhancerlist)]
print(TF_notinrange)
>>> TF_notinrange

解释

获取不包含在任何增强列表范围内的 TFlist 范围

【讨论】:

    【解决方案3】:

    您可以使用链式比较来更清楚地了解您在这里尝试做什么,以及不太常见的 for-else 块,其中 else 子句仅在 for 循环未过早中断时触发.

    non_overlapping = []
    
    for tf_a, tf_b in TFlist:
        for enhancer_a, enhancer_b in enhancerlist:
            if enhancer_a <= tf_a < tf_b <= enhancer_b:
                break
        else:
            non_overlapping.append([tf_a, tf_b])
    

    请注意,这假设所有对都已经排序,并且没有任何对包含长度为零的范围(例如,(2, 2))。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 2021-07-14
      • 2023-02-25
      相关资源
      最近更新 更多