Форум сайта python.su
Привет,
Есть некоторое консольное приложение с множеством ключей. Нужно перебрать все параметры и создать список уникальных командных строчек. Пусть есть словарь “имя ключа”:. Например:
par = {
‘-q’ : ,
‘-w’ : ,
‘-e’ : ,
‘-r’ : ,
‘-f’ : ,
‘-t’ : ,
‘-d’ : ,
}
Хочется узнать способ как получить этот набор уникальных команд не путем кучей forов, а более изящно. Возможно функциональное программирование здесь можно применить.
Офлайн
А чем optparse не угодил?
Офлайн
Это совсем про другое. Мне в скрипте нужно сгенерировать различные комбинации. А не парсить командную строку для скрипта
Офлайн
Пока есть только решение с кучей for.
v = par.values()
for x,y,z,m,n,k,l,f in [(x,y,z,m,n,k,l,f ) for x in v for y in v for z in v for m in v for n in v for k in v for l in v for f in v]:
print x + “ ” + y + “ ” + z + “ ” + m + “ ” + n + “ ” + k + “ ” + l + “ ” + f
Но оно мне не нравится, так как у меня параметров аж 16.
Офлайн
itertools.permutations, itertools.product
Офлайн
http://code.activestate.com/recipes/502199/
Отсюда взял генератор. Одно плохо, полный перебор дает миллиарды комбинаций :) Питон не выдерживает и вылетает с MemoryError.
Офлайн
можно рекурсией сделать
Офлайн
А какая разница? ) Там такая вложенность будет и думаю также по памяти обвалится.
Офлайн
guest01Вы наверное не генератор взяли, а первую версию, которая не ленивая. Генераторы по определению не могут так себя вести.
http://code.activestate.com/recipes/502199/
Отсюда взял генератор. Одно плохо, полный перебор дает миллиарды комбинаций :) Питон не выдерживает и вылетает с MemoryError.
import operator
def comb(*sequences):
lengths = [len(seq) for seq in sequences]
range_len_seq = range(len(sequences))
max_count = reduce(operator.mul, lengths)
_tmp = lengths + [1] # append multiplicative identity
dividers = [reduce(operator.mul, _tmp[-x-1:]) for x in range_len_seq][::-1]
modulos = lengths
for n in range(max_count):
yield [sequences[r][(n/dividers[r])%modulos[r]] for r in range_len_seq]
par = {
'-q' : ['0', '1', '2', '3', '4'],
'-w' : ['0', '1'],
'-e' : ['2', '3'],
'-r' : ['1', '2'],
'-f' : ['1 ', '2'],
'-t' : ['1', '2', '4', '8'],
'-d' : ['1', '2', '3', '4', '5', '6'],
}
groupped = [["%s%s" % (key, val) for val in vals] for key,vals in par.iteritems()]
for combination in comb(*groupped):
print combination
$ time python test.py |wc -l
1920
real 0m0.042s
user 0m0.032s
sys 0m0.004s
Офлайн