Создание списка Python с заданными индексами для каждого повторяющегося элемента - PullRequest
1 голос
/ 10 марта 2019

Первый список: содержит индексы списка соответствующего названия категории

Второй список: содержит имена категорий в виде строки

Intervals=[[Indexes_Cat1],[Indexes_Cat2],[Indexes_Cat3], ...]

Category_Names=["cat1","cat2","cat3",...]

Желаемый выход:

list=["cat1", "cat1","cat2","cat3","cat3"]

где индексы любого элемента в выходном списке размещаются с использованием списка интервалов.

Ex1:

Intervals=[[0,4], [2,3] , [1,5]]
Category_Names=["a","b","c"]

Пример: Выход 1

["a","c","b","b","a","c"]

Редактировать: Больше вариантов запуска

Ex2:

Intervals=[[0,1], [2,3] , [4,5]]
Category_Names=["a","b","c"]

Пример: Выход2

["a","a","b","b","c","c"]

Ex3:

Intervals=[[3,4], [1,5] , [0,2]]
Category_Names=["a","b","c"]

Пример: Выход 3

["c","b","c","a","a","b"]

Мое решение:

Создать любой пустой массив размером n.

Запуск цикла for для каждой категории.

output=[""]*n
for i in range(len(Category_Names)):
    for index in Intervals[I]:
       output[index]=Categories[i]  

Есть ли лучшее решение или более питонический способ? Спасибо

Ответы [ 3 ]

2 голосов
/ 10 марта 2019

Я не уверен, есть ли способ избежать вложенного цикла (сейчас я не могу думать ни о чем), так что, похоже, ваше решение хорошо.

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

output = [Category_Names[0]]*n

и затем запустить итерацию, пропуская эту категорию:

for i in range(1, len(Category_Names)):

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

Надеюсь, это поможет!

2 голосов
/ 10 марта 2019
def categorise(Intervals=[[0,4], [2,3] , [1,5]],
               Category_Names=["a","b","c"]):
    flattened = sum(Intervals, [])
    answer = [None] * (max(flattened) + 1)
    for indices, name in zip(Intervals, Category_Names):
        for i in indices:
            answer[i] = name
    return answer

assert categorise() == ['a', 'c', 'b', 'b', 'a', 'c']
assert categorise([[3,4], [1,5] , [0,2]], 
                  ["a","b","c"]) == ['c', 'b', 'c', 'a', 'a', 'b']

Обратите внимание, что в этом коде вы получите None значения в ответе, если «интервалы» не охватывают все целые числа от нуля до максимального числа интервалов. Предполагается, что ввод совместим.

1 голос
/ 10 марта 2019

Вы можете уменьшить количество созданных строк и использовать enumerate, чтобы избежать range(len(..)) для индексации.

Intervals=[[0,4], [2,3] , [1,5]]
Category_Names=["a","b","c"]

n = max(x for a in Intervals for x in a) + 1

# do not construct strings that get replaced anyhow    
output=[None] * n

for i,name in enumerate(Category_Names):
    for index in Intervals[i]:
       output[index]=name

print(output)

Выход:

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