6 votes

analyse une chaîne d'ensembles d'entiers avec des intervalles à lister

J'ai "2,5,7-9,12" chaîne.

Je veux en tirer la liste [2, 5, 7, 8, 9, 12].

Existe-t-il une fonction intégrée pour cela en Python ?

Gracias.

UPD. Je suppose que la réponse directe est Non . En tout cas, merci pour vos "snippets". J'en utilise un, suggéré par Sven Marnach .

15voto

Sven Marnach Points 133943
s = "2,5,7-9,12"
ranges = (x.split("-") for x in s.split(","))
print [i for r in ranges for i in range(int(r[0]), int(r[-1]) + 1)]

imprime

[2, 5, 7, 8, 9, 12]

5voto

Andreas Jung Points 1
s = "2,5,7-9,12"
result = list()

for item in s.split(','):
    if '-' in item:
        x,y = item.split('-')
        result.extend(range(int(x), int(y)+1))
    else:
        result.append(int(item))

print result

2voto

Anatolij Points 424

Je définirais la fonction :

def make_range(s):
    out = []
    s = s.split(',')
    for n in s:
        if '-' in n:
            n = n.split('-')
            for i in range(int(n[0]), int(n[1]) + 1):
                out.append(i)
        else:
            out.append(int(n))
    return out

print make_range("2,5,7-9,12")
#output [2, 5, 7, 8, 9, 12]

2voto

Sean Summers Points 416

Cette version gère les espaces blancs arbitraires, les plages qui se chevauchent, les plages non ordonnées et les entiers négatifs :

from itertools import chain

def group_to_range(group):
  group = ''.join(group.split())
  sign, g = ('-', group[1:]) if group.startswith('-') else ('', group)
  r = g.split('-', 1)
  r[0] = sign + r[0]
  r = sorted(int(__) for __ in r)
  return range(r[0], 1 + r[-1])

def rangeexpand(txt):
  ranges = chain.from_iterable(group_to_range(__) for __ in txt.split(','))
  return sorted(set(ranges))

>>> rangeexpand('-6,-3--1,3-5,7-11,14,15,17-20')
[-6, -3, -2, -1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20]
>>> rangeexpand('1-4,6,3-2, 11, 8 - 12,5,14-14')
[1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 14]

1voto

nightcracker Points 34498

Pas à ma connaissance, mais vous pouvez facilement en fabriquer :

  1. Créez une liste de résultats.
  2. Séparation des chaînes de caractères par , et commencer à itérer sur le résultat.
    1. Si la chaîne de caractères actuelle contient un - ajouter une plage à la liste.
    2. Si la chaîne actuelle est un nombre, elle est ajoutée à la liste.
    3. Sinon, retournez une erreur.
  3. Retourner la liste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X