Skip to main content
 首页 » 编程设计

python之将列表中的奇数和偶数移动到奇数和偶数位置

2025年05月04日11fff_TT

我有一个列表,其中奇数和偶数的数量相等。目标是修改列表以在奇数索引处具有奇数整数,在偶数索引处具有偶数整数。

这是我的方法:

我找出偶数索引和奇数索引处的数字。然后找出偶数索引处的奇数和奇数索引处的偶数。最后交换错位的数字。

x = [3, 2, 5, 6, 4, 7, 8, 9, 10, 11] 
even_pos = [] 
odd_pos = [] 
for i in range(len(x)): 
    if x[i] % 2 == 0: 
        even_pos.append(i) 
    else: 
        odd_pos.append(i) 
 
even_pos_with_odd = [] 
odd_pos_with_even = [] 
 
for j in range(len(even_pos)): 
    if even_pos[j] % 2 != 0: 
        even_pos_with_odd.append(j) 
    if odd_pos[j] % 2 == 0: 
        odd_pos_with_even.append(j) 
 
for n in range(len(even_pos_with_odd)): 
    temp =  x[odd_pos[odd_pos_with_even[n]]] 
    x[odd_pos[odd_pos_with_even[n]]] = x[even_pos[even_pos_with_odd[n]]] 
    x[even_pos[even_pos_with_odd[n]]] = temp 

尽管该解决方案有效,但我对它不是很满意。有没有更有效的解决方案来解决我的问题?我的目标是让 x[] 像 [2, 3, 6, 5, 4, 7, 8, 9, 10, 11] 可能以相同的奇数排序- 甚至格式。

请您参考如下方法:

创建列表的副本(仅用于创建等长的新列表),然后使用两个计数器跟踪将偶数和奇数插入新列表的位置,将索引递增 2每次:

def odd_even_sieve(x): 
    output = x[:] 
    even_index, odd_index = 0, 1 
    for value in x: 
        if value % 2 == 0: 
            output[even_index] = value 
            even_index += 2 
        else: 
            output[odd_index] = value 
            odd_index += 2 
    return output 

这比尝试就地交换所有内容要简单得多。

演示:

>>> def odd_even_sieve(x): 
...     output = x[:] 
...     even_index, odd_index = 0, 1 
...     for value in x: 
...         if value % 2 == 0: 
...             output[even_index] = value 
...             even_index += 2 
...         else: 
...             output[odd_index] = value 
...             odd_index += 2 
...     return output 
...  
>>> odd_even_sieve([3, 2, 5, 6, 4, 7, 8, 9, 10, 11]) 
[2, 3, 6, 5, 4, 7, 8, 9, 10, 11] 
>>> odd_even_sieve([19, 11, 23, 16, 18, 20]) 
[16, 19, 18, 11, 20, 23] 

对于排序后的输出(奇数和偶数独立排序),只需对输入进行排序:

>>> odd_even_sieve(sorted([3, 2, 5, 6, 4, 7, 8, 9, 10, 11])) 
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 
>>> odd_even_sieve(sorted([19, 11, 23, 16, 18, 20])) 
[16, 11, 18, 19, 20, 23]