Eu tenho uma lista de objetos e quero embaralhá-los. Eu pensei que poderia usar o random.shuffle
método, mas isso parece falhar quando a lista é de objetos. Existe um método para embaralhar objetos ou outra maneira de contornar isso?
import random
class A:
foo = "bar"
a1 = a()
a2 = a()
b = [a1, a2]
print(random.shuffle(b))
Isso irá falhar.
Respostas:
random.shuffle
Deveria trabalhar. Aqui está um exemplo, onde os objetos são listas:Observe que o shuffle funciona no lugar e retorna Nenhum.
fonte
random
documentação do módulo .random.sample(x, len(x))
ou apenas fazer uma cópia eshuffle
isso. Para olist.sort
qual há um problema semelhante, existe agoralist.sorted
, mas não existe uma variante semelhante parashuffle
.from random import SystemRandom
; adicionarcryptorand = SystemRandom()
e alterar a linha 3 paracryptorand.shuffle(x)
Como você aprendeu, o embaralhamento no local foi o problema. Eu também tenho problemas com frequência e também pareço esquecer também de como copiar uma lista. Usar
sample(a, len(a))
é a solução, usandolen(a)
como tamanho da amostra. Consulte https://docs.python.org/3.6/library/random.html#random.sample para obter a documentação do Python.Aqui está uma versão simples
random.sample()
que retorna o resultado aleatório como uma nova lista.fonte
old = [1,2,3,4,5]; new = list(old); random.shuffle(new); print(old); print(new)
(substitua; com novas linhas)old[:]
também poderia fazer uma cópia superficial para a listaold
.sample()
é particularmente útil para prototipar uma análise de dados.sample(data, 2)
para configurar o código de cola de um pipeline e, em seguida, "ampliá-lo" passo a passo, atélen(data)
.Levei algum tempo para conseguir isso também. Mas a documentação do shuffle é muito clara:
Então você não deveria
print(random.shuffle(b))
. Em vez disso, façarandom.shuffle(b)
e depoisprint(b)
.fonte
fonte
Se você já estiver usando o numpy (muito popular para aplicativos científicos e financeiros), poderá salvar uma importação.
http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.shuffle.html
fonte
Isso funciona bem para mim. Certifique-se de definir o método aleatório.
fonte
Se você tiver várias listas, convém definir a permutação (a maneira como embaralha a lista / reorganiza os itens da lista) primeiro e depois aplica-a a todas as listas:
Numpy / Scipy
Se suas listas são matrizes numpy, é mais simples:
mpu
Eu criei o pequeno pacote utilitário
mpu
que tem aconsistent_shuffle
função:Observe que é
mpu.consistent_shuffle
necessário um número arbitrário de argumentos. Então você também pode embaralhar três ou mais listas com ele.fonte
Essa alternativa pode ser útil para alguns aplicativos em que você deseja trocar a função de pedido.
fonte
sorted
, este é um shuffle funcional (se você gosta desse tipo de coisa).Em alguns casos, ao usar matrizes numpy, use
random.shuffle
dados duplicados criados na matriz.Uma alternativa é usar
numpy.random.shuffle
. Se você já estiver trabalhando com numpy, esse é o método preferido em relação ao genéricorandom.shuffle
.numpy.random.shuffle
Exemplo
Usando
random.shuffle
:Usando
numpy.random.shuffle
:fonte
numpy.random.permutation
podem ser de interesse: stackoverflow.com/questions/15474159/shuffle-vs-permute-numpyrandom.shuffle
documentação deve gritar Não use com arrays numpyPara one-liners, use
random.sample(list_to_be_shuffled, length_of_the_list)
com um exemplo:saídas: [2, 9, 7, 8, 3, 0, 4, 1, 6, 5]
fonte
'print func (foo)' imprimirá o valor de retorno de 'func' quando chamado com 'foo'. 'shuffle', no entanto, tem None como seu tipo de retorno, pois a lista será modificada no local e, portanto, não imprime nada. Gambiarra:
Se você gosta mais do estilo de programação funcional, convém fazer a seguinte função de wrapper:
fonte
random.sample(ls, len(ls))
se realmente deseja seguir esse caminho.Pode-se definir uma função chamada
shuffled
(no mesmo sentido desort
vssorted
)fonte
shuffle
está no lugar, portanto, não imprima o resultadoNone
, mas a lista.fonte
Você pode fazer isso:
se você quiser voltar para duas listas, divida essa lista longa em duas.
fonte
você pode criar uma função que usa uma lista como parâmetro e retorna uma versão aleatória da lista:
fonte
fonte
você pode usar a reprodução aleatória ou a amostra. sendo que ambos vêm do módulo aleatório.
OU
fonte
Verifique se você não está nomeando seu arquivo de origem random.py e se não há um arquivo no diretório ativo chamado random.pyc. Isso pode fazer com que o seu programa tente importar o arquivo random.py local em vez do módulo aleatório pythons .
fonte
fonte
_list.extend(list2)
, que é mais sucinto E mais eficiente.fonte
O processo de embaralhamento é "com substituição" , portanto a ocorrência de cada item pode mudar! Pelo menos quando os itens da sua lista também estiverem listados.
Por exemplo,
Depois de,
O número de [0] pode ser 9 ou 8, mas não exatamente 10.
fonte
Plano: escreva o shuffle sem depender de uma biblioteca para fazer o trabalho pesado. Exemplo: Percorra a lista desde o início, começando com o elemento 0; encontre uma nova posição aleatória para ela, digamos 6, coloque o valor de 0 em 6 e o valor de 6 em 0. Passe para o elemento 1 e repita esse processo, e assim por diante pelo resto da lista
fonte
my_list[i], my_list[j] = my_list[j], my_list[i]
Funciona bem. Estou tentando aqui com funções como objetos de lista:
Ele imprime: foo1 foo2 foo3 foo2 foo3 foo1 (os foos na última linha têm uma ordem aleatória)
fonte