Ну, хорошо, если вы вынуждены сохранять эту неуклюжую структуру данных, вы не можете ожидать многого. Однострочный эквивалент вашего первого решения будет выглядеть примерно так:
def samplesof(requested_cond, conditions):
return next(s for c, s in conditions if c==requested_cond)
а для второго, если вы настаиваете на однострочниках, это будет что-то вроде:
def ordered_union(the_conds, conditions):
return [s for c in the_conds for s in samplesof(c, conditions)]
Существуют более быстрые способы решения второй проблемы, но все они многострочные, например ::100100
aux_set = set(the_conds)
samples_by_cond = dict((c, s) for c, s in conditions if c in aux_set)
return [s for c in the_conds for s in samples_by_cond[c]]
Обратите внимание, что причина, по которой этот последний подход является более быстрым, заключается в том, что он использует правильные структуры данных (набор и дикт) - к сожалению, он должен создавать их сам, поскольку входящий вложенный список conditions
действительно неправильная структура данных.
Не могли бы вы инкапсулировать conditions
как переменную-член класса, который строит решающие (правильные, быстрые) вспомогательные структуры данных только один раз? E.g.:
class Sensible(object):
def __init__(self, conditions):
self.seq = []
self.dic = {}
for c, s in conditions:
self.seq.append(c)
self.dic[c] = s
def samplesof(self, requested_condition):
return self.dic[requested_condition]
def ordered_union(self, the_conds):
return [s for c in the_conds for s in self.dic[c]]
Теперь что быстро и элегантно!
Я предполагаю, что вам нужно self.seq
(последовательность условий) для чего-то другого (это определенно не нужно для двух упомянутых вами операций!), И что в этой последовательности и в примерах нет повторений ( какими бы ни были ваши настоящие характеристики, их будет не сложно принять, но вслепую пытаться угадать их, когда вы ничего не упоминаете о них будет очень сложным и бессмысленным;