J'ai un énorme jeu de données mais pour simplifier le problème, pensez à une liste 4x4 2D.
voulez faire une nouvelle liste avec 5 éléments qui sont choisis au hasard dans la liste 4x4 sans utiliser numpy ou aucune bibliothèque supplémentaire.
Éditer:
['j', 'False', 'a', 8, 66]
Je veux choisir 5 éléments de cette liste de manière aléatoire avec des fonctions de bibliothèque aléatoires
sortie peut-être comme une nouvelle liste d'éléments choisis:
[['j', 'k', 'z','p'], [1,6,8,9], [8,True,0,'a'], [66,'False', '12', '5]]
espérons que c'est assez clair.
3 Réponses :
(Votre liste pour le moment n'est pas une syntaxe tout à fait valide, mais corrigez cela):
>>> import itertools >>> import random >>> list_2d = [['j', 'k', 'z', 'p'], ... [1,6,8,9], ... [8,True,0,'a'], ... [66,'False', '12', '5']] >>> random.choices(list(itertools.chain(*list_2d)), k=5) ['False', '12', 8, 6, 'k']
L'appel itertools.chain
en une liste 1d, que la fonction random.choices
peut gérer pour échantillonner avec remplacement: https://docs.python.org/3/library/random.html#random.choices
De plus, sans plus de détails sur le problème complet, il sera difficile de savoir si cette solution sera bonne pour "l'énorme jeu de données" - elle crée une nouvelle copie de la liste complète sous forme de liste 1d, donc si cela utilise trop de mémoire, nous aurions besoin de voir d'où proviennent les données, et si vous pouviez éviter la structure de liste de listes en premier lieu.
avec le module aléatoire, vous pouvez utiliser une compréhension de liste:
import random list_2d = [... your list 4X4] randmly_chosen = [random.choice(random.choice(list_2d)) for _ in range(5)]
L'idée d'aplatir les ls
pourrait encore être empruntée à numpy
sans aucune utilisation de ses méthodes:
ls = [['j', 'k', 'z', 'p'], [1,6,8,9], [8,True,0,'a'], [66,'False', '12', '5']] flat_ls = [] for n in ls: flat_ls.extend(n) from random import shuffle shuffle(flat_ls) #dynamic change of flat_ls, very fast >>> flat_ls[:5] ['12', 66, 8, 'j', 'a']
malheureusement ce n'est pas encore assez clair ... voulez-vous choisir un élément dans une liste imbriquée? pouvez-vous poster ce que vous avez essayé?
j'ai édité ma question. Merci pour les commentaires.
Je suggérerais de donner une taille approximative plutôt que de dire «énorme», les estimations de l'ordre de grandeur suffisent. par exemple, vous voulez que cela fonctionne avec des tableaux 2D d'environ 1 milliard sur 100, soit 10¹¹ éléments. notez que vous n'utiliserez presque certainement pas la bibliothèque standard à ce stade, mais tant pis
tu as raison. je suivrai votre suggestion à partir de maintenant. merci @SamMason