随机移动Python列表中的一定数量的项目

时间:2016-02-10 01:23:12

标签: python algorithm list sorting

所以我一直在做一些排序算法,我想运行一个生成不同变种列表的测试函数来运行我的排序算法。

一个这样的列表将是一个已经排序的列表,其中列表中的n个项目随机混乱(但不是全部,列表仍然应该排序除n项之外)

testlist = random.sample(range(0,10),10)
testlist.sort()

这给了我一个大小为10的唯一项目的排序列表,但是我不确定如何将列表中的这10个项目中的 n 移动到随机位置,只是混合排序

3 个答案:

答案 0 :(得分:5)

这是在列表中随机播放一些项目的一种方法:

import random
import numpy as np

# Make a sorted list of integers.
x = np.array(range(100))

# Choose 10 indices at random.
r = random.sample(range(len(x)), 10)

# Copy this list and shuffle.
s = r.copy()
random.shuffle(s)

# Replace the indices with the shuffled ones.
x[r] = x[s]

请注意,这可能会使一些指数保持不变。

答案 1 :(得分:3)

这是一个受控制的实施。 随机选择四个指数以进行切换。将这些值洗牌,然后将它们放回四个指定的位置。请注意,它不能保证新值全部不同。

import random
import copy

testlist = random.sample(range(0, 20), 10)
testlist.sort()
print testlist

n = 4
move_set = set()
while len(move_set) < n:
    move_set.add(random.randrange(0, 10))

print move_set
move_list = list(move_set)

# Replace n elements
test1 = copy.copy(testlist)
migrant = [test1[_] for _ in move_set]
random.shuffle(migrant)
print migrant
test_case = []
for i in range(n):
    test1[move_list[i]] = migrant[i]
print test1

输出:

[0, 3, 4, 5, 7, 8, 9, 12, 16, 17]
set([9, 3, 4, 5])
[5, 17, 8, 7]
[0, 3, 4, 17, 8, 7, 9, 12, 16, 5]

在这次运行中,所有四个指数都是列表中的值,这只是巧合。元件9,3,4和5分别具有值17,1,5和8。洗牌将四者中的每一个都放入新的位置。

答案 2 :(得分:2)

这样的事情会起作用。基本上,只需随机选择两个索引并切换它们,而不是多次切换相同的索引。如果在已排序的数组上运行,则可以保证正确的n元素未排序。仅适用于偶数替换。

array = list(range(10))

def shuffle_n(array, n):
    assert n <= len(array) and n % 2 == 0
    indexes = set(range(len(array)))
    for i in range(n // 2):
        a, b = random.sample(indexes, 2)
        indexes.remove(a)
        indexes.remove(b)
        array[a], array[b] = array[b], array[a]