[PYTHON] Alle Elemente bewegen sich (bleiben nicht in derselben Position)

8/25 Nachschrift

endgültige Version? ?? http://qiita.com/ttatsf/items/d4543ccc80e0fbe3891d#comment-3eccf9c112d73c505bc2

8/23 Nachtrag

Es wurde darauf hingewiesen, dass das folgende Programm nicht alle Mischmuster abdeckt. Ein Beispiel für einen seltsamen Austausch wie [0,1,2,3] → [1,0,3,2]. Bitte seien Sie vorsichtig, wenn Sie es verwenden.

8/21 Nachtrag

Es scheint, dass es schließlich zwei Linien (weiße Augen) wurde

def shuffle_all_move(items):
    rand_ord = random.sample(range(len(items)), k=len(items))
    return [items[r] for i, r in sorted(zip(rand_ord, rand_ord[1:]+rand_ord[:1]))]

Die Ausführungsgeschwindigkeit scheint für den obigen Code etwas schneller zu sein (Messergebnisse werden im Kommentarbereich veröffentlicht).


8/19 Nachtrag

Ich mag die von ttatsf im Kommentarbereich. (7of9 führte die Basis "Sattro's Algorithmus" ein) Vielen Dank an alle, die den Code in den Kommentaren geschrieben haben.

import random

def shuffle_all_move( items ):
  length = len( items )
  res = [ 0 ] * length
  rand_ord = random.sample( range( length ), k=length )
  for i in range(  length  ) :
    res[ rand_ord[ i ] ] = items[ rand_ord[ ( i + 1 ) % length ] ]
  return res

Wirklich elegant! Daher würde ich empfehlen, das oben genannte aus dem entsprechenden DIY-Shuffle unten zu verwenden.


Ursprünglicher Beitrag

Es ist eine Python + Numpy-Implementierung von Shuffle, die Elemente absolut verschiebt (beachten Sie, dass angenommen wird, dass das Array 3 oder mehr Elemente enthält). Verfahren

  1. Teilen Sie das Element zufällig in 3 Gruppen ein
  2. Mischen Sie für jede Gruppe
  3. Schieben Sie eine Gruppe.

Eine zufällige Gruppenteilung von 1 wird tatsächlich durch Mischen und anschließendes Teilen des Arrays in drei realisiert. Selbst wenn Sie eine Gruppe gemischter Arrays verschieben, ist dies für die Position des ursprünglichen Arrays irrelevant, sodass diese Zufallswiedergabe später wiederhergestellt wird. Dies garantiert, dass es sich immer an eine andere Position als die ursprüngliche Sequenz bewegt.

Dieser Code leiht den Code auf den folgenden zwei Seiten aus. ※ resettable_shuffle/reset_shuffle http://qiita.com/EafT/items/9527cb30409b70106fd4 ※ divide_list http://fits.hatenablog.com/entry/2015/11/09/211012

def shuffle_all_move(_array):
    array = _array.copy()
    seed = random.randint(0,np.iinfo(np.int32).max)
    resettable_shuffle(array,seed)
    array = divide_list(array,3)
    if type(array[0]) == list:
        array = array[-1] + array[0] + array[1]
    else:
        array = np.vstack((array[-1], array[0],array[1]))
    return reset_shuffle(array,seed)

Ausführungsbeispiel

test_array = ['a','b','c','d','e','f']
print(test_array)
test_array = shuffle_all_move(test_array)
print(test_array)

['a', 'b', 'c', 'd', 'e', 'f'] ['c', 'e', 'f', 'b', 'd', 'a']

Recommended Posts

Alle Elemente bewegen sich (bleiben nicht in derselben Position)
Stellen Sie sicher, dass alle Elemente in der Liste in Python identisch sind
[Python] Kombinieren Sie alle Elemente in einem Array
[Python] Gibt alle Kombinationen von Elementen in der Liste aus
Übergeben Sie sich in der Klasse nicht an ProcessPoolExecutor
Stellen Sie fest, ob alle Listenelemente im Diktatschlüssel vorhanden sind