我有一个元组列表,需要删除每个与其他元组重叠的整数值

2024-10-05 10:56:04 发布

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

我有一个元组列表,每个元组中有两个整数和一个字符串。 我需要生成一个新的列表,删除整数范围在其他元组中重叠的元组

我试过这个:


list_all = [(0, 3, 'textA'), (0, 5, 'textB'), (8, 11, 'textC')]

empty_list = []

for i in list_all:
  range_i = list( range(list_all[i][0], list_all[i][1]) )
  
  for j in list_all:
    range_j = list( range(list_all[j][0], list_all[j][1]) )
    
    if  all( item in range_j for item in range_i ) == False:
      empty_list.append(range_i)

empty_list

但我得到了一个错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-233-b4cebb65d49c> in <module>()
      4 
      5 for i in list_all:
----> 6   range_i = list( range(list_all[i][0], list_all[i][1]) )
      7 
      8   for j in list_all:

TypeError: list indices must be integers or slices, not tuple

Tags: 字符串in列表forrange整数allitem
3条回答

如果我理解正确的话,您只希望在元组与其他元组具有重叠范围时,保持具有最大范围的元组。可以使用集合比较运算符<检查某个范围是否在另一个范围内。注意set(a) < set(b)实际上意味着set(a)set(b)的子集,不等于set(b)

以下是您的问题的单行代码:

list_all = [(0, 3, 'textA'), (0, 5, 'textB'), (8, 11, 'textC')]

res = [t for t in list_all if not any(set((range(t[0], t[1]))) < set(r)
       for r in [range(i, j) for (i, j, _) in list_all])]
print(res)

输出:

[(0, 5, 'textB'), (8, 11, 'textC')]

其思想是首先获取所有范围,并仅选择范围集不小于任何其他元组范围集的元组

当然,你也可以这样写

res = [t for t in list_all if all(set((range(t[0], t[1]))) > set(r)
       for r in [range(i, j) for (i, j, _) in list_all])]

这是我的代码的固定版本(谢谢Eric Cartman)。我意识到我需要的是一个没有ex.(0,3,'textA')的列表,因为0-3与0-5重叠


list_all = [(0, 3, 'textA'), (0, 5, 'textB'), (8, 11, 'textC'), (20, 25, 'textD')]

empty_list = []

for i in range(len(list_all)):
  range_i = list( range(list_all[i][0], list_all[i][1]) )
  
  for j in range(len(list_all)):
    range_j = list( range(list_all[j][0], list_all[j][1]) )
    
    if  all( item in range_j for item in range_i ) == False:
      empty_list.append(list_all[i])


empty_list

我有这个输出,我几乎有了,但我正在生成副本:

'''
[(0, 3, 'textA'),
 (0, 3, 'textA'),
 (0, 5, 'textB'),
 (0, 5, 'textB'),
 (0, 5, 'textB'),
 (8, 11, 'textC'),
 (8, 11, 'textC'),
 (8, 11, 'textC'),
 (20, 25, 'textD'),
 (20, 25, 'textD'),
 (20, 25, 'textD')]
'''

之所以出现此错误,是因为i指向元组,而不是索引(因为您编写了for i in list_all:而不是for i in range(len(list_all))

对于手头的任务,是否只保留与任何内容不重叠的间隔,还是保留不重叠的最大间隔数的列表?例如,如果有3个范围a、B、C,其中a和C与B重叠,但a与C不重叠,是否返回[a、C]或[]

相关问题 更多 >

    热门问题