2017-09-27 14 views
5

Ví dụ, như đểCó chức năng nào bằng Python trộn dữ liệu theo khối dữ liệu không?

[1 2 3 4 5 6] 

Xáo dữ liệu trong khi vẫn giữ khối dữ liệu (bao gồm cả 2 dữ liệu) như trước đây. Và chúng tôi sẽ có được:

[3 4 1 2 5 6] 

Bất kỳ cách nào trong Python để thực hiện việc này?

+1

Bởi "khối dữ liệu", bạn có nghĩa là nó nên giữ lại 2 cặp trong ví dụ của bạn không? Giống như '1, 2' nên luôn ở bên nhau? – Felk

Trả lời

7

Một cách đơn giản để làm điều này là sử dụng sau ba bước:

  1. tạo khối (danh sách 2d);
  2. trộn danh sách đó; và
  3. hợp nhất lại các danh sách này.

Vì vậy:

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] 

Nếu bạn không muốn để lưu trữ các dữ liệu trở lại trong data, bạn có thể chỉ cần sử dụng:

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

Đối với dữ liệu này tôi thu được:

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

lần thứ hai:

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

Đẹp, nhưng tôi cảm thấy phải có một cách thanh lịch hơn để thực hiện điều này trong 'numpy' ... –

+2

@Chris_Rands [đó là] (https://stackoverflow.com/a/32492169/1040092) :) – Wondercricket

+1

Cảm ơn cho câu trả lời đó là cách tổng quát để trộn dữ liệu theo khối. – jmir

3

Bạn có thể sử dụng các mô-đun random và gọi hàm random.shuffle() - điều này sẽ xáo trộn mọi phần tử trong danh sách của bạn, vì vậy phá vỡ danh sách của bạn vào các danh sách con trước khi shuffling

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

Tôi tin rằng OP muốn nhóm dữ liệu (do đó * khối *), để các cặp liền kề tiếp tục liền kề sau khi trộn. – SwiftsNamesake

1

Không có lệnh nội trú, nhưng bạn có thể viết một helper nhỏ để làm điều đó cho bạn:

1- tạo các khối
2- Xáo chúng
3 flatten các khối và trả lại kết quả xáo trộn trình tự. mẫu

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) 

đầu ra:

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

Với việc sử dụng tối đa các phương pháp tiêu chuẩn:

>>> 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] 
2

Cách đơn giản

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) 

Output

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

Đẹp, nó xáo trộn các chỉ số khối. – VPfB

0

Ai đó yêu cầu một giải pháp sử dụng 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]) 

này shuffles quan điểm reshaped tại chỗ, nhưng một giữ kích thước ban đầu của nó, do đó không cần phải định hình lại trở lại.

Các vấn đề liên quan