Создать список строковых шаблонов из диапазона в Python

У меня было такое же требование: когда пользователь нажимает на значок расширения, должно открыться небольшое всплывающее окно. В моем случае я писал расширение, которое будет давать обновления по выборочным акциям всякий раз, когда нажимается значок. Вот как выглядело мое всплывающее окно.

Если у вас было одно и то же требование, прочитайте ниже.

как мой файл manifest.json выглядел.

Весь тяжелый подъем был обработан только файлом manifest.json. Существует раздел browser_action, внутри которого есть ключ с именем default_popup, просто поместите имя файла HTML, которое вы хотите отобразить всплывающее окно.

Я хотел, чтобы мое расширение работало на всех поэтому я добавил атрибут matches в content_scripts. Мне действительно не нужно было помещать файл jquery jquery-3.2.1.js в массив js, но диспетчер расширений не позволял мне оставить этот массив пустым.

Надеюсь, что это поможет, сделайте комментарий, если у вас есть любые сомнения относительно ответа.

-2
задан Daneel Olivaw 17 March 2019 в 21:18
поделиться

3 ответа

Другой (немного более компактный) способ:

name, first, second = a.split('_')
first_range = range(int(first[1]), int(first[3]) + 1)
second_range = range(int(second[1]), int(second[3]) + 1)

res = ['{}_{}_{}'.format(name, i, j) for j in second_range for i in first_range]
# ['NAME_1_3', 'NAME_2_3', 'NAME_1_4', 'NAME_2_4', 'NAME_1_5', 'NAME_2_5']
0
ответ дан Merig 17 March 2019 в 21:18
поделиться

То, что вы ищете, это декартово произведение . По сути, это дает все возможные комбинации двух входов списка. К счастью, библиотека Python itertools имеет встроенный класс product, который может выступать в качестве итератора. Итак, теперь мы хотим сделать это в 3 шага:

  1. Разобрать строку
  2. Сгенерировать декартово произведение
  3. Восстановить строку
[1110 ] 1. Разобрать строку

Поскольку я предполагаю, что вы можете иметь любое количество {x:y} с, мы будем использовать цикл while

def parse_string(string): 
    index_of_ = string.find ("_")
    name = string [:index_of_]
    if index_of_ == -1: return name, []
    ranges = []
    while index_of_ != -1:  # still an _
        next_underscore = string.find ("_", index_of_ + 1)
        if next_underscore == -1:  # last underscore
            range_ = string [index_of_ + 1:]
        else: range_ = string [index_of_ + 1:next_underscore]
        start = range_ [1 : range_.find (":")]
        end = range_ [range_.find (":") + 1 : -1]
        ranges.append (tuple (range (int (start), int (end) + 1)))  # put all those numbers in
        if next_underscore == -1: break
        else: index_of_ = next_underscore
    return name, ranges

Эта функция зацикливает строку, извлекает имя и итеративно находит диапазоны. Он возвращает имя и список всех диапазонов, поэтому для вашего примера - NAME, [(1, 2), (3, 4, 5)]

2. Генерация комбо

Теперь, когда у нас есть список всех диапазонов, давайте получим декартово произведение этого списка.

from itertools import product   
    def generate_combos(ranges): 
        return product (*ranges)  # unpack the list

Это просто помогает нам передать список в product, который выполняет всю тяжелую работу.

3. Генерация строки

Здесь нам нужна функция для объединения двух других. Сначала он анализирует строку, чтобы получить диапазоны и имя. Затем для каждой комбинации декартового произведения он итеративно добавляет цифру к имени, а затем сохраняет результат:

def generate_string(string): 
    name, ranges = parse_string (string)
    results = []
    for combo in generate_combos (ranges):
        result = name
        for num in combo: 
            result += f"_{num}"
        results.append (result)
    return results

Пример:

print (generate_string ("NAME_{1:2}_{3:5}"))

Дает:

['NAME_1_3', 'NAME_1_4', 'NAME_1_5', 'NAME_2_3', 'NAME_2_4', 'NAME_2_5']
0
ответ дан Levi Lesches 17 March 2019 в 21:18
поделиться

Самый элегантный и динамичный способ решения этой проблемы - использование рекурсии:

import re

a = "NAME_{1:2}_{3:5}"
b = "NAME_{1:2}"
c = "NAME"
d = "NAME_{1:2}_{3:4}_{7:8}"

def recure(myRanges, myString, varReference):

    if not myRanges:
        varReference.append(myString)
        return

    for i in myRanges[0]:
        tempVar = myRanges[:]
        del tempVar[0]
        recure(tempVar, myString + "_" + str(i), varReference)


def getMyList(myInput):
    myInputList = list(myInput)

    a = [i.start() for i in re.finditer('{', myInput)]

    try:
        myName = myInput[:a[0] - 1]
    except:
        myName = myInput

    myRanges = [range(int(myInputList[i + 1]), int(myInputList[i + 3]) + 1) for i in a]

    myList = []

    recure(myRanges, myName, myList)

    return myList

print(getMyList(a)) # -> ['NAME_1_3', 'NAME_1_4', 'NAME_1_5', 'NAME_2_3', 'NAME_2_4', 'NAME_2_5']
print(getMyList(b)) # -> ['NAME_1', 'NAME_2']
print(getMyList(c)) # -> ['NAME']
print(getMyList(d)) # -> ['NAME_1_3_7', 'NAME_1_3_8', 'NAME_1_4_7', 'NAME_1_4_8', 'NAME_2_3_7', 'NAME_2_3_8', 'NAME_2_4_7', 'NAME_2_4_8']

Оригинальный пост

.

a = "NAME_{1:2}_{3:5}"
aList = list(a)

myString = a[:a.find("_")]

startI = int(aList[a.find("{") + 1])
endI = int(aList[a.find("}") - 1]) + 1

startII = int(aList[a.rfind("{") + 1])
endII = int(aList[a.rfind("}") - 1]) + 1

myList = []

for i in range(startI, endI):
    for j in range(startII, endII):
        myList.append(myString + "_" + str(i) + "_" + str(j))

print(myList) # -> ['NAME_1_3', 'NAME_1_4', 'NAME_1_5', 'NAME_2_3', 'NAME_2_4', 'NAME_2_5']
0
ответ дан jeanggi90 17 March 2019 в 21:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: