Есть несколько множеств списков, в каждом множестве элементы внутри списка идут в определенном порядке. Мне нужно слить все множества в одно, ну и при этом изменить списки так, чтобы элементы были в заданном порядке.
Вот упрощенный пример:
Входные данные
{'RGB': set([10, 20, 30], [11, 21, 31]), 'GBR': set([22,32,12], [23, 33,13])}
Правильный порядок RGB.
Нужно получить:
set([10, 20, 30], [11, 21, 31], [12, 22, 32], [13, 23, 33])
Более сложный пример: в некоторых множествах списки имеют больше или меньше элементов, чем в шаблоне. Лишние элементы игнорируются, на место недостающих пишется null.
def you_func(d):
result = set()
for k, v in d.items():
r, g, b = k.index('R'), k.index('G'), k.index('B')
for color in v:
result.add((color[r], color[g], color[b]))
return result
либо
def f(d):
return {(c[k.index('R')], c[k.index('G')], c[k.index('B')]) for k, v in d.items() for c in v}
Это если у тебя только перестановки RGB. P.S. Не используй списки для хранения цветов. Это не нужно, к тому же, списки не хэшируются (ты не засунешь их в set). Используй кортежи.
Цвета это только для примера, чтобы был очевиден правильный порядок. В реальности у меня там некие строки.
RGB хотелось бы передавать как параметр, а не хардкодить
Списки я получаю функцией split из длинных строк с разделителями. Как мне получать кортежи?
pavel0staratel: в моём примере тоже очевиден правильный порядок. Не хардкодь - скидывай в функцию строку с правильным порядком и ищи в ней индексы. Это же очевидно, разве нет? Чтобы из списка получить кортеж - юзай tuple(your_list)
pavel0staratel: кстати, один из вариантов хранения - словарь. Тогда даже так ухищряться не придётся. Например, {'R': 10, 'G': 20, 'B', 30}. И потом как хочешь, так и представляешь.
Этот вопрос не имеет отношения к питону, простое слияние списков, сперва логично сделать сортировку всех списков с правильным RGB, потом в цикле просто слить в один. В целом такие алгоритмы ещё в школе изучают.