Уплотнение комбинаций для ставок (1X2) в Python

У меня возникли проблемы с достижением моей цели по уменьшению купонов для ставок на питоне.

Я пытаюсь сократить ряды ставок в форме 1X2 до комбинированных купонов. Поскольку строки генерируются другим программным обеспечением, они представляют собой отдельные строки, а не комбинированные, т.е. 8 игр в одном ряду = 1X21X21X, 1XX1X21X, 1X11X21X и т. д.

Лучше посмотрите на 3 строки:

1 1 1
X X X
2 X 1 <-- diff
1 1 1
X X X
2 2 2
1 1 1
X X X

Дифференциал, конечно, может быть где угодно и может быть во всех позициях.

Теперь я хочу прочитать каждую строку, а затем объединить как можно больше строк примерно так: 1,X,1X2,1,X,2,1,X (пример для трех строк выше)

Лучший вид:

1
X
1X2
1
X
2
1
X

Я попытался получить этот результат, перебирая строки и сопоставляя их одну за другой с одними и теми же строками. Но безрезультатно.

Последнее усилие привело к вложенному словарю, подобному этому:

{u'1': {u'X': {u'1': {u'1': {u'X': {u'2': {u'1': {u'X': ''}}}}}, 
               u'X': {u'1': {u'X': {u'2': {u'1': {u'X': ''}}}}}, 
               u'2': {u'1': {u'X': {u'2': {u'1': {u'X': ''}}}}}}}}

Но оттуда я понятия не имею, как это сделать. И это хороший путь?

Я очень благодарен за любую помощь в этом вопросе, желательно с некоторыми примерами кода. Спасибо!

Обновление, спасибо Аарону Холлу:

Мои 20 рядов:

product_list = '''2222XX12
22X2XX12
2212XX12
221XX212
221XX112
222XX212
222XX112
22XXX212
22XXX112
22X2X212
22X2X112
2X1XX212
2X1XX112
2X12X212
2X12XX12
2X12X112
2XX2X212
2XX2XX12
2XX2X112
2XXXX212
'''

Оформление букмекера:

product_list = product_list.splitlines()

betting_slip = [set(i) for i in zip(*product_list)]

Получаем один купон:

pprint(betting_slip)

[set([u'2']),
 set([u'2', u'X']),
 set([u'1', u'2', u'X']),
 set([u'2', u'X']),
 set([u'2']),
 set([u'1', u'2', u'X']),
 set([u'1']),
 set([u'2']),

Возвращаем эти ставки обратно к одиночным рядам:

txt_sets = [set(line) for line in betting_slip]
product_list = list(itertools.product(*txt_sets))

product_list = [''.join(tuple_i) for tuple_i in product_list]

И это приводит к 36 строкам:

pprint(product_list)

[u'2X1XX112',
 u'2X1XXX12',
 u'2X1XX212'
 ...

Проблема

Но это проблема, которая у меня есть прямо сейчас. Созданный нами купон для ставок теперь содержит 36 рядов или комбинаций. Что мне нужно, так это купон/квитанции для ставок, которые содержат только те 20 строк, с которых мы начали.

Я сделал картинку, иллюстрирующую купоны для ставок: http://i.imgur.com/H5h3K4K.png

Как видите, из 20 рядов должно получиться 6 купонов для ставок, а не тот, который содержит 36 рядов.


person dinc    schedule 24.02.2014    source источник
comment
Я вижу, вы новичок, обычно хорошо публикуете код, который вы уже пробовали, и, возможно, результаты, которые вы ожидаете получить.   -  person Aaron Hall    schedule 25.02.2014
comment
Я не понимаю, что вы пытаетесь сделать...   -  person Joran Beasley    schedule 25.02.2014
comment
Ниже приведено то, что вы пытаетесь выполнить?   -  person Aaron Hall    schedule 25.02.2014
comment
@AaronHall Что ж, я пытаюсь найти связанные строки. Я собираюсь сделать обновление, пытаясь объяснить это лучше.   -  person dinc    schedule 25.02.2014
comment
@AaronHall Я на самом деле просматривал документы для itertools прямо сейчас :) И то, что вы показали, находится на правильном пути, но я на самом деле пытаюсь сделать наоборот. Изготовление квитанций из отдельных рядов. У вас есть идеи, как это сделать?   -  person dinc    schedule 25.02.2014
comment
@AaronHall Ааа, хе-хе, я вижу, мне здесь есть чему поучиться :) Ну, вы почти поняли ;) Дело в том, что когда мы берем 20 уникальных строк и объединяем их, а затем снова делаем их отдельными строками, они увеличиваются. до 36 ряда. Нам нужно создать уникальные купоны для ставок, содержащие только эти 20 строк. Я сделал обновление с изображением этих 6 листов, просто в качестве примера. Итак, как заставить set() понять, что нам нужны только комбинированные наборы с этими 20 уникальными строками? Кстати, спасибо за вашу помощь! :) Очень признателен!   -  person dinc    schedule 25.02.2014
comment
Я не вижу ничего особенного в ваших 20 уникальных строках. Можете ли вы сказать мне, что особенного или важного в этих 20 рядах? Вы не ясно говорите о своих ограничениях. Мне пришлось ломать голову над тем, о чем вы спрашивали с самого начала.   -  person Aaron Hall    schedule 25.02.2014
comment
@AaronHall Я обновил свой вопрос вашим кодом и попытался прояснить, чего я пытаюсь достичь. Спасибо за помощь, мне очень помогло!   -  person dinc    schedule 25.02.2014


Ответы (1)


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

txt = '''1 1 1
X X X
2 X 1
1 1 1
X X X
2 2 2
1 1 1
X X X'''

Вы можете удалить пробелы, а затем разделить на строки:

txt_list = txt.replace(' ', '').splitlines()

txt_list:

['111', 'XXX', '2X1', '111', 'XXX', '222', '111', 'XXX']

А затем удалите лишние элементы в каждой строке, поместив строки в наборы:

txt_sets = [set(line) for line in txt_list]

for i in txt_sets:
    print(i)

распечатывает:

set(['1'])
set(['X'])
set(['1', 'X', '2'])
set(['1'])
set(['X'])
set(['2'])
set(['1'])
set(['X'])

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

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

import itertools
product_list = list(itertools.product(*txt_sets))

и product_list:

[('1', 'X', '2', '1', 'X', '2', '1', 'X'), 
 ('1', 'X', '1', '1', 'X', '2', '1', 'X'), 
 ('1', 'X', 'X', '1', 'X', '2', '1', 'X')]

Используя ваше изображение:

txt = '''2
X2
1X2
X2
X
1X2
1
2'''
txt_list = txt.replace(' ', '').splitlines()
txt_sets = [set(line) for line in txt_list]
import itertools
product_list = list(itertools.product(*txt_sets))
len(product_list)

возвращает 36

и мы можем объединить их в строки,

import pprint
product_list = [''.join(tuple_i) for tuple_i in product_list]
pprint.pprint(product_list)

и результат распечатывает:

['2X1XX112',
 '2X1XXX12',
 '2X1XX212',
 '2X12X112',
 '2X12XX12',
 '2X12X212',
 '2XXXX112',
 '2XXXXX12',
 '2XXXX212',
 '2XX2X112',
 '2XX2XX12',
 '2XX2X212',
 '2X2XX112',
 '2X2XXX12',
 '2X2XX212',
 '2X22X112',
 '2X22XX12',
 '2X22X212',
 '221XX112',
 '221XXX12',
 '221XX212',
 '2212X112',
 '2212XX12',
 '2212X212',
 '22XXX112',
 '22XXXX12',
 '22XXX212',
 '22X2X112',
 '22X2XX12',
 '22X2X212',
 '222XX112',
 '222XXX12',
 '222XX212',
 '2222X112',
 '2222XX12',
 '2222X212']

Вернуться еще проще:

back_to_sets = [set(i) for i in zip(*product_list)]
pprint.pprint(back_to_sets)

распечатывает (в Python 3):

[{'2'},
 {'X', '2'},
 {'1', 'X', '2'},
 {'X', '2'},
 {'X'},
 {'1', 'X', '2'},
 {'1'},
 {'2'}]
person Aaron Hall    schedule 24.02.2014
comment
Я думаю, что вы на что-то здесь. Я обновил свой пост, чтобы он мог быть немного яснее. Спасибо! - person dinc; 26.02.2014