5

で作成されたタプルがあり、タプルzip()の各整数から 1 を引く必要があります。私は次のことを試しましたが、どうやらリストでしか機能しないようです。これを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]
4

3 に答える 3

6

tupleジェネレーター式でコンストラクターを使用します。

lower = tuple(x - 1 for x in lower)
upper = tuple(x + 1 for x in upper)
于 2013-02-13T21:50:57.573 に答える
6

これらを単一のリスト内包表記で解決することもできます。

holes = [(table[i][1]+1, table[i+1][0]-1) for i in range(len(table)-1)]
于 2013-02-13T21:57:48.317 に答える
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]ます。すべてのカップル (L,H) について、 --> につながる
という事実を考えると。 したがって、最初の間隔に関する最初のテストは常に False であり、実際のプロセスは 2 番目の間隔で開始されます。H>=L
first H > first L - 1first prec > first L - 1

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 の指示ではありません)
、テストなしでエラーが発生する可能性
がありますが、実際にはエラーは発生しません。

上記のコードでギャップの正しいリストを与えるための間隔のリストの規則は、間隔を 2 番目の要素に沿って並べ替える必要があるということです。

.

will に置き換えるyield (prec,L-1)yield range(prec,L)、ギャップが範囲として与えられます。

たとえば、に置き換えるyield (prec,L-1)と、関数なしでコードを書くことができます。holes.append((prec,L-1))

于 2013-02-13T23:45:34.213 に答える