我在实现减少 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 行的投注单/单。
我做了一张图片来说明投注单:https://i.stack.imgur.com/5tEEn.png
如您所见,20 行应该会产生 6 张投注单,而不是包含 36 行的投注单。
您是否正在尝试拆分行并减少冗余元素?
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'}]