我有一个用zip()
创建的元组,我需要从元组中的每个整数中减去一个。我试过以下但显然它只适用于列表,那么我如何在Python中为元组调整它呢?
[...]
lower, upper = zip(*table)
lower[:] = [x + 1 for x in lower]
upper[:] = [x - 1 for x in upper]
holes = zip(lower[:-1], upper[1:])
TypeError:'tuple'对象不支持项目分配
大图是我在table
中存储了一系列非重叠的排序区间,我需要获得一系列漏洞。例如。我的间隔表可能是:
[ 6, 7]
[ 8, 9]
[14, 18]
[23, 32]
我想在间隔之间计算holes
:
[10, 13]
[19, 22]
答案 0 :(得分:6)
将tuple
构造函数与生成器表达式一起使用:
lower = tuple(x - 1 for x in lower)
upper = tuple(x + 1 for x in upper)
答案 1 :(得分:6)
您也可以在单个列表理解中解决这些问题:
holes = [(table[i][1]+1, table[i+1][0]-1) for i in range(len(table)-1)]
答案 2 :(得分:2)
使用生成器功能可以轻松完成任务。
table = [(2,3),(5,6),(12,20),(21,25),(28,28),(35,48),(53,55)]
def gaps_between(intervals):
prec = intervals[0][1] + 1
for L,H in intervals:
print '\nprec = %d (L,H) = (%d,%d)' % (prec,L,H)
print 'prec = %d <= L-1 = %d : %s' % (prec,L-1,prec<=L)
if prec<=L-1:
yield (prec,L-1)
prec = H + 1
print 'next prec = %d' % prec
holes = list(gaps_between(table))
print
print 'table =',table
print 'holes =',holes
在前一个答案中,我使用了在生成器内定义的迭代器
为了避免这种情况,我在上面使用了一个策略:
定义first prec = first H = intervals[0][1]
。
鉴于H>=L
每对夫妇(L,H)的事实,它导致了
first H > first L - 1
- &gt; first prec > first L - 1
。
因此,关于第一个区间的第一个测试始终为False,而实际过程从第二个区间开始。
prec = 3 (L,H) = (2,3)
prec = 3 <= L-1 = 1 : False
next prec = 4
prec = 4 (L,H) = (5,6)
prec = 4 <= L-1 = 4 : True
next prec = 7
prec = 7 (L,H) = (12,20)
prec = 7 <= L-1 = 11 : True
next prec = 21
prec = 21 (L,H) = (21,25)
prec = 21 <= L-1 = 20 : True
next prec = 26
prec = 26 (L,H) = (28,28)
prec = 26 <= L-1 = 27 : True
next prec = 29
prec = 29 (L,H) = (35,48)
prec = 29 <= L-1 = 34 : True
next prec = 49
prec = 49 (L,H) = (53,55)
prec = 49 <= L-1 = 52 : True
next prec = 56
table = [(2, 3), (5, 6), (12, 20), (21, 25), (28, 28), (35, 48), (53, 55)]
holes = [(4, 4), (7, 11), (26, 27), (29, 34), (49, 52)]
结果是正确的:
- 它给出了(2,3)和(5,6)之间的间隙(4,4)
- (12,20)和(21,25)之间没有差距
- (28,28)中的值28没有任何差距
OP表示间隔没有重叠和分类
但是,测试if prec<=L-1
是强制性的,否则连续的间隔会产生错误:
没有这个测试,结果将包含
....., (7, 11), (21, 20), (26, 27), .......
。
通过此强制性测试,以下列表的间隔发生
[[ 8, 9],[14, 18],[18, 32]]
[[8, 9], [14, 18], [19, 20], [16, 21], [23, 32]]
这是重叠的(不是OP说的)
没有测试就会出错,
事实上不会产生任何错误。
使用上面的代码给出正确的间隙列表的间隔列表规则是间隔必须沿第二个元素排序。
用yield (prec,L-1)
替换yield range(prec,L)
会将差距作为范围。
例如,用yield (prec,L-1)
替换holes.append((prec,L-1))
可以编写没有函数的代码。