2011-01-14 6 views
1

私は周りを見回し、すべての奇数と偶数のエントリを反転させることによって32エントリタプルをソートする適切な方法を見つけることができないようです。バイトで単語、ソートを並べ替える

例:私の現在のコードは、この

i=0 
nd = [] 
while i < len(self.r.ipDeviceName): 
    print(i) 
    if i%2: 
     nd[i]=self.r.ipDeviceName[i-1] 
    else: 
     nd[i]=self.r.ipDeviceName[i+1] 
dn = "".join(map(chr,nd)) 
devicenameText.SetValue(dn) 

のように見えます

1 0 3 2 5 4 7 6 9 8 
to 
0 1 2 3 4 5 6 7 8 9 

self.r.ipDeviceNameの種類はタプルと私のどちらかはIndexErrorまたはタプルが」doesnの取得しますコードのバリエーションに応じてを割り当てます

私も同じことを試しました同じ結果と

nd = self.r.ipDeviceName 
for i in nd: 
    if i&0x01: 
     nd[i]=self.r.ipDeviceName[i-1] 
    else: 
     nd[i]=self.r.ipDeviceName[i+1] 
dn = "".join(map(chr,nd)) 
devicenameText.SetValue(dn) 

結果。非常にシンプルなものが私を逃れているようです。あなたの助けと時間をありがとう。

+1

最初のコードサンプルでは 'i'は決してインクリメント/デクリメントされず、2番目のコードではインデックスではありません。 –

答えて

0

タプルを変更することはできませんが、変更できません。しかし、あなたはあなたが望むように配置された新しいものでそれらを置き換えることができます(私はあなたが "ソート"したいものと呼ぶつもりはありません)。これを行うには、元のタプルにあるアイテムの各ペアを交換するために必要なのはすべてです。

ここは簡単な実装です。あなたがそのケースをどのように処理したかったのか決して言わなかったので、奇数のものがある場合は、最後のエントリだけを残すことに注意してください。その可能性を扱うと、コードがわずかに複雑になります。

def swap_even_odd_entries(seq): 
    tmp = list(seq)+[seq[-1]] # convert sequence to mutable list and dup last 
    for i in xrange(0, len(seq), 2): 
     tmp[i],tmp[i+1] = tmp[i+1],tmp[i] # swap each entry with following one 
    return tuple(tmp[:len(seq)]) # remove any excess 

a = (1, 0, 3, 2, 5, 4, 7, 6, 9, 8) 
a = swap_even_odd_entries(a) 
b = (91, 70, 23, 42, 75, 14, 87, 36, 19, 80) 
b = swap_even_odd_entries(b) 
c = (1, 0, 3, 2, 5) 
c = swap_even_odd_entries(c) 
print a 
print b 
print c 
# output 
# (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 
# (70, 91, 42, 23, 14, 75, 36, 87, 80, 19) 
# (0, 1, 2, 3, 5) 

同じことを、長い単一の式として読みにくい方法で行うこともできます。長さが奇数の場合も、最後のエントリは変更されません。

swap_even_odd_entries2 = lambda t: tuple(
    v for p in [(b,a) for a,b in zip(*[iter(t)]*2) + [(t[-1],)*2]] 
     for v in p)[:len(t)] 

a = (1, 0, 3, 2, 5, 4, 7, 6, 9, 8) 
a = swap_even_odd_entries2(a) 
b = (91, 70, 23, 42, 75, 14, 87, 36, 19, 80) 
b = swap_even_odd_entries2(b) 
c = (1, 0, 3, 2, 5) 
c = swap_even_odd_entries2(c) 
print 
print a 
print b 
print c 
# output 
# (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 
# (70, 91, 42, 23, 14, 75, 36, 87, 80, 19) 
# (0, 1, 2, 3, 5) 
+0

これは私が理解する必要があったものです。ありがとうございます。 – Mashuu

3

タプルは変更できません。タプルは作成後は変更できません。代わりに、リストのような変更可能なコレクションにデータを格納する個々の要素を変更する。組み込み関数listtupleを使用して、タプルからリストへの変換、またはその逆の変換を行うことができます。

別の方法としては、元を変更することなく、既存のタプルから新しいタプルを作成するzipと機能的なスタイルのアプローチを使用することができます。

>>> t = tuple(range(10)) 
>>> tuple(x for i in zip(t[1::2], t[::2]) for x in i) 
(1, 0, 3, 2, 5, 4, 7, 6, 9, 8) 

またはitertools.chainを使用して:

>>> import itertools 
>>> tuple(itertools.chain(*zip(t[1::2], t[::2]))) 
(1, 0, 3, 2, 5, 4, 7, 6, 9, 8) 

注意を使用することをzipここでは、あなたのタプルに偶数の要素があることを前提としています。

+0

私は何かを見逃してしまったようです。私はzipとintertoolsについて知りませんでした。ありがとう – Mashuu

0

あなたのツールセットに(itertools recipesを参照)の機能grouperflattenを追加する場合は、あなたが行うことができます:

xs = [1, 0, 3, 2, 5, 4, 7, 6, 9, 8] 
xs2 = flatten((y, x) for (x, y) in grouper(2, xs)) 
# list(xs2) => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

あなたもflatten(imap(reversed, grouper(2, xs))を書くことができますが、私は唯一のダイハード機能人は希望を推測それ。

関連する問題