Задать вопрос
pavel0staratel
@pavel0staratel

Как упорядочить элементы списка по шаблону?

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

Вот упрощенный пример:
Входные данные
{'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.

Как это сделать в наиболее Python-way?
  • Вопрос задан
  • 868 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
adugin
@adugin Куратор тега Python
>>> input = {'RGB': {(10, 20, 30), (11, 21, 31)}, 'GBR': {(22,32,12), (23, 33,13)}}
>>> [map(dict(zip(key, triplet)).get, 'RGB') for key, triplets in input.iteritems() for triplet in triplets]
[[10, 20, 30], [11, 21, 31], [13, 23, 33], [12, 22, 32]]
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@deliro
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). Используй кортежи.
Ответ написан
opium
@opium
Просто люблю качественно работать
Этот вопрос не имеет отношения к питону, простое слияние списков, сперва логично сделать сортировку всех списков с правильным RGB, потом в цикле просто слить в один. В целом такие алгоритмы ещё в школе изучают.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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