在数组中查找非交叉对,并在Python中迭代删除,直到没有对为止

2024-03-29 08:06:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个元组列表,其中包含数组中成对的起始和结束索引点。你知道吗

(2,72), (20,73),(22,70), (25,30)

我想提取一对,比如a,这样数组中没有其他对在a的范围内有开始索引或结束索引。例如,在这里,我第一次提取(25,30),因为没有其他对的起点或终点在25到30之间。一旦我提取出来,我就剩下:

(2,72), (20,73),(22,70)

然后我提取(22,70),这个列表剩下:

(2,72), (20,73)

因为(2,72)包含20个,而(20,73)包含72个,所以不能进一步提取对。你知道吗

暴力手段:

  1. 假设list_tuple是一个元组列表
  2. 基于起始索引对list_tuple排序
  3. 从列表中提取元素
  4. 如果提取的元素满足条件,请检查所有其他对
    1. 如果不是,则移动到排序列表的下一个元素
    2. 如果条件为true,则提取元素,更改列表并使用新列表重复


Checklist=[(2,72), (20,73),(22,70), (25,30)]
sortedlist=sorted(Checklist,key=itemgetter(0))
i=0
NewList=list()
len_sortedlist=len(sortedlist)
while i< len_sortedlist:
    condition=True
    checkpair =sortedlist[i]
    removelist=copy.deepcopy(sortedlist)
    del removelist[i]
    for pair in removelist:# check for every pair if it is within checked pair list
        if pair[0] in range(checkpair[0],checkpair[1]) or pair[1] in range(checkpair[0],checkpair[1]) :
            condition=False
            i=i+1
            break    
    if condition==True:
        NewList.append(checkpair)
        sortedlist.remove(checkpair)
        sortedlist=sorted(sortedlist,key=itemgetter(1))
        i=0
        len_sortedlist=len(sortedlist)

我想知道有没有更好更有效的方法?你知道吗


Tags: in元素列表lenif排序数组condition
1条回答
网友
1楼 · 发布于 2024-03-29 08:06:58

使用itertools函数,比如ifilter,怎么样?你知道吗

>>> import itertools
>>> 
>>> def check_element(checkpair):
...     for pair in checklist:
...         if  checkpair != pair and (pair[0] in range(checkpair[0],checkpair[1]) or pair[1] in range(checkpair[0],checkpair[1]) ):
...             return bool
... 
>>> checklist = [(2,72), (20,73),(22,70), (25,30)]
>>> print checklist
[(2, 72), (20, 73), (22, 70), (25, 30)]
>>> filtered = itertools.ifilter(check_element, checklist) #returns generator
>>> checklist = list(filtered)                             #exahust iterator to create list
>>> print checklist
[(2, 72), (20, 73), (22, 70)]
>>> _filtered = itertools.ifilter(check_element, checklist)
>>> checklist = list(_filtered)
>>> print checklist
[(2, 72), (20, 73)]

相关问题 更多 >