Python中是否有一个按数据块对数据进行混洗的函数?

时间:2017-09-27 12:32:07

标签: python list shuffle

例如,

[1 2 3 4 5 6]

在保持数据块(包括2个数据)的同时对数据进行随机播放。我们将获得:

[3 4 1 2 5 6]

用Python做任何方式吗?

6 个答案:

答案 0 :(得分:7)

直接的方法是使用以下三个步骤:

  1. 创建块(2d列表);
  2. 洗牌那个名单;和
  3. 再次合并这些列表。
  4. 所以:

    import random
    
    # Import data
    data = [1,2,3,4,5,6]
    blocksize = 2
    
    # Create blocks
    blocks = [data[i:i+blocksize] for i in range(0,len(data),blocksize)]
    # shuffle the blocks
    random.shuffle(blocks)
    # concatenate the shuffled blocks
    data[:] = [b for bs in blocks for b in bs]
    

    如果您不想将数据存回data,您只需使用:

    data = [b for bs in blocks for b in bs]
    

    对于我获得的这些数据:

    >>> data
    [3, 4, 1, 2, 5, 6]
    

    第二次:

    >>> data
    [5, 6, 1, 2, 3, 4]
    

答案 1 :(得分:3)

您可以使用random模块并调用函数random.shuffle() - 这会随机播放列表中的每个元素,因此请在重排之前将列表分成子列表

import random, itertools

mylist = [1, 2, 3, 4, 5, 6]
blocks = [mylist[x:x+2] for x in range(0, len(mylist), 2)]
random.shuffle(blocks)
list(itertools.chain.from_iterable(blocks))
>> [3, 4, 1, 2, 5, 6]

答案 2 :(得分:2)

最大限度地使用标准方法:

>>> import random, itertools
>>> a
[1, 2, 3, 4, 5, 6]

# group elements by 2
>>> grouped = list(zip(*[iter(a)]*2))
>>> grouped
[(1, 2), (3, 4), (5, 6)]

# shuffle groups
>>> random.shuffle(grouped)
>>> grouped
[(3, 4), (1, 2), (5, 6)]

# flatten groups to list
>>> list(itertools.chain.from_iterable(grouped))
[3, 4, 1, 2, 5, 6]

答案 3 :(得分:2)

简单方法

import random
data = [1,2,3,4,5,6]
temp = range(len(data)/2)
random.shuffle(temp)
data_c = data[:]
for i, j in enumerate(temp):
    if not i == j:
        data_c[i*2],data_c[(i*2)+1] = data[j*2],data[(j*2)+1]
print(data_c)

输出

[1, 2, 5, 6, 3, 4]

答案 4 :(得分:1)

没有内置组件,但你可以编写一个小助手为你做这个:

1-创建块
2-洗牌他们 3-展平块并返回生成的混洗序列。

    import random

    def shuffle_by_blocks(seq, blocksize):
        blocks = [seq[idx*blocksize: (idx+1)*blocksize] for idx in range(len(seq)//blocksize)]
        random.shuffle(blocks)
        return [elt for block in blocks for elt in block ]

    shuffle_by_blocks([1,2,3,4,5,6], 2)

输出样本:

[1, 2, 5, 6, 3, 4]

答案 5 :(得分:1)

有人要求使用numpy解决方案:

>>> import numpy as np
>>> a = np.array([1, 2, 3, 4, 5, 6])
>>> np.random.shuffle(a.reshape((-1, 2)))
>>> a
array([5, 6, 3, 4, 1, 2])

这会将重新塑造的视图移动到位,但是保持其原始尺寸,因此无需重新塑造。