我有一个列表,其中奇数和偶数的数量相等。目标是修改列表以在奇数索引处具有奇数整数,在偶数索引处具有偶数整数。
这是我的方法:
我找出偶数索引和奇数索引处的数字。然后找出偶数索引处的奇数和奇数索引处的偶数。最后交换错位的数字。
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]
