繁体   English   中英

从 Python 范围之间的列表中删除项目

[英]Remove items from a list between ranges in Python

我正在尝试从列表中删除一些项目。 要删除的那些项目由定义范围开始和结束的两个列表给出的不同范围定义。

输入应具有以下结构,但让我指出第一个和最后一个列表应该是灵活的,它们的长度并不总是为 2:

list = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
first = [3,9]
last = [5,13]

从我的初始列表中,我需要删除值 3 和 5 之间的项目以及值 9 和 13 之间的项目,所以我的最终结果是:

lst = [0,1,2,6,7,8,14,15]

让我发布到目前为止我所做的没有成功的事情:

list = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
first = [3,9]
last = [5,13]
lst = []


for i in list:
  for j, k in zip(first, last):
    if i > j and i < k:
      break
    else:
      lst.append(i)
    break
print(lst)

谢谢和问候,

您可以为firstlast的所有相应元素构建范围对象,如下所示

>>> ranges = [range(start, end + 1) for start, end in zip(first, last)]

然后只需检查当前数字是否不属于任何范围。 这是可能的,因为范围对象允许我们查询特定数字是否在范围内。

>>> [num for num in list if all(num not in rng for rng in ranges)]
[0, 1, 2, 6, 7, 8, 14, 15]

在您的代码中,您必须检查所有范围以查看当前数字是否不在其中。 仅当当前数字满足该条件时,才应将其包含在结果中。

list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
first = [3, 9]
last = [5, 13]
result = []


for current_num in list:
     found_matching_range = False

     for start, end in zip(first, last):
          if start <= current_num <= end: # Note the `=`. Inclusive comparison
               found_matching_range = True
               break

     if not found_matching_range:
          result.append(current_num)
print(result)

你几乎拥有它。 只需将else缩进它所属的位置,删除坏的break ,并进行比较:

list = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
first = [3,9]
last = [5,13]
lst = []


for i in list:
  for j, k in zip(first, last):
    if i >= j and i <= k:
      break
  else:
    lst.append(i)
print(lst)

在线尝试!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM