用于在Python中下注(1X2)的压缩组合

时间:2014-02-24 23:28:20

标签: python numbers combinations consolidation

我在达到减少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': ''}}}}}}}}

但是从那里我不知道该怎么做。这是一个很好的方式吗?

我非常感谢这方面的任何帮助,最好是一些代码示例。谢谢!

更新,感谢Aaron Hall:

我的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行。

1 个答案:

答案 0 :(得分:0)

您是否尝试拆分线路,并减少冗余元素?

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'}]