Разбор строк и целых чисел (w / sets) из строки в список с использованием Python - PullRequest
0 голосов
/ 28 февраля 2012

Я хочу взять строку, которая выглядит следующим образом: 'Oreo.12.37-40.Apple.78' и превратить ее в список, который выглядит следующим образом:

['Oreo', 12, 37, 38, 39, 40, 'Apple', 78]

Где '-' вызывает итерацию между значениями. («37-40» становится [37,38,39,40])

https://stackoverflow.com/a/5705014/1099935 есть действительно хорошее решение, но я не понимаю его достаточно, чтобы знать, как включить обработку строк. (Отлично работает только с числом, но не работает со строками в int ())

комментарии заблокированы для меня (?), Поэтому добавим еще один комментарий: мне нужен список, содержащий либо значения int, либо строки. Затем с помощью объектов Q в фильтрах элементы можно отфильтровать по общему имени или назначенному ключу продукта (как правило, короткие и также часто используемые)

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Это делает это:

#!/usr/bin/python

import re

s = 'Oreo.12.37-40.Apple.78'
l=[]
for e in re.split('[^\w-]+',s):
    m=re.match('(\d+)-(\d+)',e)
    if m:
       x=int(m.group(1))
       y=int(m.group(2))
       for i in range(x,y+1):
          l.append(i)   
    else:       
       try:
          l.append(int(e))
       except ValueError:
          l.append(e)

print l  

Вывод:

['Oreo', 12, 37, 38, 39, 40, 'Apple', 78]
1 голос
/ 28 февраля 2012

Вот вариант:

def custom_split(s):
    def int_range_expand(s):
        try:
            return [int(s)]
        except ValueError:
            try:
                start, end = map(int, s.split('-'))
                return range(start, end+1)
            except Exception:
                pass
        return [s]
    return sum(map(int_range_expand, s.split('.')), [])

>>> custom_split('Oreo.12.37-40.Apple.78')
['Oreo', 12, 37, 38, 39, 40, 'Apple', 78]

Используется подход EAFP , шаги которого разбиты ниже:

1. custom_split('Oreo.12.37-40.Apple.78')
2. s <= 'Oreo.12.37-40.Apple.78'
3. s.split('.') => ['Oreo', '12', '37-40', 'Apple', '78']
4. map(int_range_expand, ['Oreo', '12', '37-40', 'Apple', '78'])
       => [['Oreo'], [12], [37, 38, 39, 40], ['Apple'], [78]]
5. sum([['Oreo'], [12], [37, 38, 39, 40], ['Apple'], [78]], [])
       => ['Oreo', 12, 37, 38, 39, 40, 'Apple', 78]

Функция int_range_expand() из шага 4 всегда возвращает список. Если аргумент является строкой или int, результат будет иметь только один элемент, но если это диапазон типа 37-40, то он будет содержать каждое целое число в этом диапазоне. Это позволяет нам легко объединить все полученные списки в один список.

Шаг 5 аналогичен itertools.chain, который более эффективен, но требует импорта модуля, в зависимости от вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...