2
votes

Rechercher la longueur des séquences de nombres supérieurs à x dans une liste

Je veux comprendre le modèle sous-jacent de certains nombres dans une séquence, et pour ce faire, je dois récupérer la longueur des séquences, lesquels nombres sont tous supérieurs à une valeur choisie arbitraire x (qui représentent le type de gravité).

Une séquence peut être par exemple:

x=6
[1, 3] # since there are only two sequences with values greater than 6 (the 6 alone, and the triplet 6,7,6]

Dans ce cas, un scénario peut être:

list = [4, 3, 4, 5, 2, 5, 6, 5, 5, 6, 7, 6 ]


7 commentaires

une boucle for simple et simple ne devrait pas être trop difficile à coder. avez-vous essayé ça?


Alors avez-vous essayé d'adapter ce code à vos besoins? Vous ne devriez pas simplement vous attendre à ce qu'il vous soit remis.


@jonrsharpe Je ne veux pas du code, je veux savoir s'il existe une meilleure façon de structurer l'algorithme. J'ai résolu le problème en partant de la gravité maximale et en diminuant d'une unité de manière itérative le maximum, de sorte que j'obtienne le bon nombre de longueurs de motifs. Voulez-vous que je publie ceci? Comme je l'ai dit, est inspiré du problème similaire de trouver des longueurs de motifs avec la même valeur unique


@ Ev.Kounest probablement que je devrais ajouter que je fais cela pour environ 2000 fichiers, donc je préférerais toujours l'option non pour la boucle. Mais oui, vous avez raison. Je me demandais s'il y avait un moyen d'utiliser groupby de cette façon mais je ne pense pas


Alors je ne sais pas ce que vous demandez. Essayez-vous de déterminer la valeur appropriée de x? Sur quelle base?


Non, je suis prêt à récupérer une valeur x arbitraire donnée: les longueurs de tous les modèles qui existent qui satisfont la condition d'un modèle qui est que tous les éléments d'un modèle sont supérieurs à x . Dois-je mettre à jour quelque chose, quelle partie vous semble trompeuse?


Alors oui, vous pouvez adapter l'utilisation de groupby dans l'autre question. Cette méthode ne fonctionne pas uniquement pour des séquences de nombres égaux, c'est juste le problème spécifique auquel ils l'ont appliquée; vous devez changer la condition et ajouter du filtrage.


3 Réponses :


1
votes

Vous pouvez utiliser itertools.groupby :

from itertools import groupby

data = [4, 3, 4, 5, 2, 5, 6, 5, 5, 6, 7, 6 ]
x = 6

out = [sum(1 for _ in group) for is_larger, group in groupby(data, lambda value: value>=x) if is_larger]
print(out)
#[1, 3]

groupby regroupe les valeurs en fonction de la condition value> = x , qui devient la clé is_larger . p>

Nous ne conservons que les groupes où is_larger vaut True , et pour ceux-ci, nous obtenons leur longueur avec sum (1 for _ in group) .


0 commentaires

0
votes

Une méthode alternative utilisant groupby:

from itertools import groupby

data = [4, 3, 4, 5, 2, 5, 6, 5, 5, 6, 7, 6 ]
x = 6

out = [len(list(group)) for larger, group in groupby(elem >= x for elem in data) if larger]

Cette méthode fonctionne en regroupant les valeurs selon la comparaison booléenne elem> = x , puis en enregistrant les longueurs du groupes dans une liste de compréhension.


0 commentaires

0
votes

Je le ferais comme ça, pour rendre les étapes plus lisibles. Peut-être pas la solution la plus élégante, mais ne nécessite que des fonctions de base de compréhension de liste et de chaîne.

list = [0 if el < 6 else el for el in list]
str = ''.join(str(el) for el in list)
sequences = [seq for seq in str.split('0') if seq is not '']
lengths = [len(seq) for seq in sequences]


2 commentaires

C'est un artefact comme le mien de remplacer itérativement les nombres maximums, mais merci, je vais tester lequel est le plus efficace


Je pense que pour une mise en œuvre efficace, vous devriez envisager d'utiliser numpy.