Список диктовок - Частичная перестановка - PullRequest
2 голосов
/ 22 января 2020

Предположим, у меня есть это:

my_list = [{'id':'2','value':'4'},
{'id':'6','value':'3'},
{'id':'4','value':'5'},
{'id':'9','value':'10'},
{'id':'0','value':'9'}]

, и я хочу перетасовать список, но я хочу сделать это частично - я имею в виду, что я не хочу перетасовывать все элементы, а только процент из них (например, 40%).

Например, например:

my_list = [{'id':'4','value':'5'},
{'id':'6','value':'3'},
{'id':'2','value':'4'},
{'id':'9','value':'10'},
{'id':'0','value':'9'}]

Как это можно эффективно сделать?

Ответы [ 2 ]

1 голос
/ 22 января 2020

random.shuffle не позволяет указывать только часть списка, он всегда перетасовывает весь список.

Компромисс между усилием, скоростью и объемом памяти будет заключаться в том, чтобы вырезать часть списка, которую вы хотите перетасовать, сделайте это, а затем назначьте обратно этому фрагменту:

>>> from random import shuffle
>>> x = list(range(10))
>>> y = x[:5]
>>> shuffle(y)
>>> x[:5] = y
>>> x
[2, 1, 4, 3, 0, 5, 6, 7, 8, 9]
0 голосов
/ 24 января 2020

Мое решение следующее:

from random import sample

shuffle_percentage = 0.4
x = sample(range(len(my_list)), int(len(my_list) * shuffle_percentage))

for index in range(0, len(x)-1, 2):
    my_list[x[index]], my_list[x[index+1]] = my_list[x[index+1]], my_list[x[index]]
...