Чтобы сделать вещи проще, но еще сложнее, я попытался реализовать концепцию «комбинированных/сжатых тегов», которые далее расширяются на несколько базовых форм тегов.Реверсирование (или упрощение) декартова произведения?
В этом случае метки состоят из (одного или более) "суб-тега (ов)", с разделителями точкой с запятой:
food:fruit:apple:sour/sweet
drink:coffee/tea:hot/cold
wall/bike:painted:red/blue
Slashes указывают на "суб-тег" взаимозаменяемость. Поэтому переводчик переводит их на это:
food:fruit:apple:sour
food:fruit:apple:sweet
drink:coffee:hot
drink:coffee:cold
drink:tea:hot
drink:tea:cold
wall:painted:red
wall:painted:blue
bike:painted:red
bike:painted:blue
код используется (не идеально, но работает):
import itertools
def slash_split_tag(tag):
if not '/' in tag:
return tag
subtags = tag.split(':')
pattern, v_pattern =(),()
for subtag in subtags:
if '/' in subtag:
pattern += (None,)
v_pattern += (tuple(subtag.split('/')),)
else:
pattern += (subtag,)
def merge_pattern_and_product(pattern, product):
ret = list(pattern)
for e in product:
ret[ret.index(None)] = e
return ret
CartesianProduct = tuple(itertools.product(*v_pattern)) # http://stackoverflow.com/a/170248
return [ ':'.join(merge_pattern_and_product(pattern, product)) for product in CartesianProduct ]
#===============================================================================
# T E S T
#===============================================================================
for tag in slash_split_tag('drink:coffee/tea:hot/cold'):
print tag
print
for tag in slash_split_tag('A1/A2:B1/B2/B3:C1/C2:D1/D2/D3/D4/EE'):
print tag
Вопрос: Как я могу вернуть этот процесс? Мне нужно это для удобства чтения.
Спасибо, вот именно то, что я хотел. Сортировка и разбор входных данных здесь не проблема. Я просто не мог понять все комбинации. Таким образом, подсчет базового элемента должен быть равен, а затем просто объединяться по столбцам. Спасибо за ваше время и счастливый новый год;] – Firebowl2000