单词中的字节排序,python中的元组排序

2024-10-04 03:15:45 发布

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

我环顾四周,似乎找不到正确的方法来排序一个32项元组,把每一个奇数和偶数项都颠倒过来。在

例如:

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

我当前的代码是这样的

^{pr2}$

ipDeviceName的类型是tuple,根据代码的变化,我要么得到一个索引器错误,要么一个元组不支持赋值

我也尝试了同样的结果

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)

同样的结果。一些很简单的事情似乎让我捉摸不透。谢谢你的帮助和时间。在


Tags: to方法代码self类型排序错误元组
3条回答

你不能改变元组,它们是不可变的。然而,你可以用一个新的,你想要的方式来代替它们(我不会把你想要的叫做“排序”)。为此,需要交换原始元组中的每对项。在

这是一个直接的实现。请注意,如果最后一个条目的数目是奇数,那么它将不显示最后一个条目,因为您从未说过希望如何处理该案件。处理这种可能性会使代码稍微复杂一些。在

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)

同样的事情也可以用一种可读性较差的方式来完成,比如一个长的单表达式。同样,如果长度为奇数,最后一个条目保持不变。在

^{pr2}$

元组是不可变的-一旦它们被创建,就不能修改它们。要修改单个元素,您需要将数据存储在可变集合(如列表)中。您可以使用内置函数listtuple从元组转换为列表,反之亦然。在

或者,您可以使用^{}和函数式方法从现有的元组创建新的元组,而不必修改原始元组:

>>> 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)

或使用^{}

^{pr2}$

注意,这里使用zip假设元组有偶数个元素(根据您的问题,这里就是这种情况)。在

如果将函数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)),但我想只有死硬的功能型人才会喜欢它。在

相关问题 更多 >