在单词中对字节进行排序,在python中对元组进行排序

时间:2011-01-14 21:10:34

标签: python

我环顾四周,似乎找不到通过反转每个奇数和偶数条目来排序32个入口元组的正确方法。

前:

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

我目前的代码如下所示

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)

self.r.ipDeviceName的类型是元组,我得到 IndexError 元组不支持赋值,具体取决于代码的变化

我也尝试了相同的结果

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)

结果相同。一些非常简单的东西似乎无法逃避。谢谢你的帮助和时间。

3 个答案:

答案 0 :(得分: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假设您的元组具有偶数个元素(根据您的问题,此处就是这种情况)。

答案 1 :(得分: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)

答案 2 :(得分:0)

如果您将功能grouperflatten(请参阅itertools recipes)添加到您的工具集,则可以执行以下操作:

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)),但我想只有顽固的功能人才会喜欢它。