在 Python 中生成给定游戏列表的可能组合
Generating possible Combinations of a given list of games in Python
我想从给定的游戏列表中生成可能性的总数,例如 ['France - Germany'。
在这种情况下,总结果将是 3 种可能的结果 {要么主队获胜,他们平局,要么客队获胜}。
- 可能的结果是 3
1
FRANCE - GERMANY 1
2
FRANCE - GERMANY x
3
FRANCE - GERMANY 2
对于另一种情况,列表是 ['France - Germany'、'Spain - Italia']
- 可能的结果数是 9
1
FRANCE - GERMANY 1
SPAIN - ITALIA 1
2
FRANCE - GERMANY 1
SPAIN - ITALIA x
3
FRANCE - GERMANY 1
SPAIN - ITALIA 2
4
FRANCE - GERMANY x
SPAIN - ITALIA 1
5
FRANCE - GERMANY x
SPAIN - ITALIA x
6
FRANCE - GERMANY x
SPAIN - ITALIA 2
7
FRANCE - GERMANY 2
SPAIN - ITALIA 1
8
FRANCE - GERMANY 2
SPAIN - ITALIA x
9
FRANCE - GERMANY 2
SPAIN - ITALIA 2
以下是我的代码
import itertools
games = ['France - Germany']
case = ["1","X","2"]
results = []
for eachcase in case:
for game in games:
results.append("%s %s" % (game, eachcase))
print("\n".join(results)+ "\n %s" %len(results))
列表中项目的输出是
France - Germany 1
France - Germany X
France - Germany 2
这很好,但随着列表项目数量的增加,它不起作用。在此先感谢您对解决此问题的任何帮助:)
您可以使用列表理解轻松地做到这一点:
fg = [ ("FRANCE-GERMANY",outcome) for outcome in (1,"x",2) ]
for g1 in fg: print(g1)
print("")
si = [ ("SPAIN-ITALY",outcome) for outcome in (1,"x",2) ]
final = [ (g1,g2) for g1 in fg for g2 in si ]
for g1,g2 in final:
print(g1)
print(g2)
print("")
如果你想要更通用的方法,itertools 模块中的 product 函数也可以提供帮助:
from itertools import product
fg = list(product(["FRANCE-GERMANY"],(1,"x",2)))
si = list(product(["SPAIN-ITALY"],(1,"x",2)))
final = list(product(fg,si))
您可以使用 itertools.product
和 repeat 参数来创建与游戏总数一样多的游戏结果产品。
from itertools import product
games = ['France - Germany', 'Spain - Italia']
case = ["1","X","2"]
results = []
for i in product(case, repeat = len(games)):
results.append({k:v for k, v in zip(games, i)})
#if you prefer list of tuples instead, alternatively,
#results.append([(k, v) for k, v in zip(games, i)])
print(results)
输出:
[{'France - Germany': '1', 'Spain - Italia': '1'},
{'France - Germany': '1', 'Spain - Italia': 'X'},
{'France - Germany': '1', 'Spain - Italia': '2'},
{'France - Germany': 'X', 'Spain - Italia': '1'},
{'France - Germany': 'X', 'Spain - Italia': 'X'},
{'France - Germany': 'X', 'Spain - Italia': '2'},
{'France - Germany': '2', 'Spain - Italia': '1'},
{'France - Germany': '2', 'Spain - Italia': 'X'},
{'France - Germany': '2', 'Spain - Italia': '2'}]
对于给定的游戏列表,我们可以为此使用 itertools.product
:
from itertools import product
def game_product(games):
for i, res in enumerate(product('1x2', repeat=len(games)), 1):
print(i)
for gr in zip(games, res):
print('{} {}'.format(*gr))
例如:
>>> game_product(['France - Germany', 'Spain - Italia', 'Brazil - Spain'])
1
France - Germany 1
Spain - Italia 1
Brazil - Spain 1
2
France - Germany 1
Spain - Italia 1
Brazil - Spain x
3
France - Germany 1
Spain - Italia 1
Brazil - Spain 2
4
France - Germany 1
Spain - Italia x
Brazil - Spain 1
5
France - Germany 1
Spain - Italia x
Brazil - Spain x
6
France - Germany 1
Spain - Italia x
Brazil - Spain 2
7
France - Germany 1
Spain - Italia 2
Brazil - Spain 1
8
France - Germany 1
Spain - Italia 2
Brazil - Spain x
9
France - Germany 1
Spain - Italia 2
Brazil - Spain 2
10
France - Germany x
Spain - Italia 1
Brazil - Spain 1
11
France - Germany x
Spain - Italia 1
Brazil - Spain x
12
France - Germany x
Spain - Italia 1
Brazil - Spain 2
13
France - Germany x
Spain - Italia x
Brazil - Spain 1
14
France - Germany x
Spain - Italia x
Brazil - Spain x
15
France - Germany x
Spain - Italia x
Brazil - Spain 2
16
France - Germany x
Spain - Italia 2
Brazil - Spain 1
17
France - Germany x
Spain - Italia 2
Brazil - Spain x
18
France - Germany x
Spain - Italia 2
Brazil - Spain 2
19
France - Germany 2
Spain - Italia 1
Brazil - Spain 1
20
France - Germany 2
Spain - Italia 1
Brazil - Spain x
21
France - Germany 2
Spain - Italia 1
Brazil - Spain 2
22
France - Germany 2
Spain - Italia x
Brazil - Spain 1
23
France - Germany 2
Spain - Italia x
Brazil - Spain x
24
France - Germany 2
Spain - Italia x
Brazil - Spain 2
25
France - Germany 2
Spain - Italia 2
Brazil - Spain 1
26
France - Germany 2
Spain - Italia 2
Brazil - Spain x
27
France - Germany 2
Spain - Italia 2
Brazil - Spain 2
我想从给定的游戏列表中生成可能性的总数,例如 ['France - Germany'。 在这种情况下,总结果将是 3 种可能的结果 {要么主队获胜,他们平局,要么客队获胜}。
- 可能的结果是 3
1 FRANCE - GERMANY 1 2 FRANCE - GERMANY x 3 FRANCE - GERMANY 2
对于另一种情况,列表是 ['France - Germany'、'Spain - Italia']
- 可能的结果数是 9
1 FRANCE - GERMANY 1 SPAIN - ITALIA 1 2 FRANCE - GERMANY 1 SPAIN - ITALIA x 3 FRANCE - GERMANY 1 SPAIN - ITALIA 2 4 FRANCE - GERMANY x SPAIN - ITALIA 1 5 FRANCE - GERMANY x SPAIN - ITALIA x 6 FRANCE - GERMANY x SPAIN - ITALIA 2 7 FRANCE - GERMANY 2 SPAIN - ITALIA 1 8 FRANCE - GERMANY 2 SPAIN - ITALIA x 9 FRANCE - GERMANY 2 SPAIN - ITALIA 2
以下是我的代码
import itertools
games = ['France - Germany']
case = ["1","X","2"]
results = []
for eachcase in case:
for game in games:
results.append("%s %s" % (game, eachcase))
print("\n".join(results)+ "\n %s" %len(results))
列表中项目的输出是
France - Germany 1
France - Germany X
France - Germany 2
这很好,但随着列表项目数量的增加,它不起作用。在此先感谢您对解决此问题的任何帮助:)
您可以使用列表理解轻松地做到这一点:
fg = [ ("FRANCE-GERMANY",outcome) for outcome in (1,"x",2) ]
for g1 in fg: print(g1)
print("")
si = [ ("SPAIN-ITALY",outcome) for outcome in (1,"x",2) ]
final = [ (g1,g2) for g1 in fg for g2 in si ]
for g1,g2 in final:
print(g1)
print(g2)
print("")
如果你想要更通用的方法,itertools 模块中的 product 函数也可以提供帮助:
from itertools import product
fg = list(product(["FRANCE-GERMANY"],(1,"x",2)))
si = list(product(["SPAIN-ITALY"],(1,"x",2)))
final = list(product(fg,si))
您可以使用 itertools.product
和 repeat 参数来创建与游戏总数一样多的游戏结果产品。
from itertools import product
games = ['France - Germany', 'Spain - Italia']
case = ["1","X","2"]
results = []
for i in product(case, repeat = len(games)):
results.append({k:v for k, v in zip(games, i)})
#if you prefer list of tuples instead, alternatively,
#results.append([(k, v) for k, v in zip(games, i)])
print(results)
输出:
[{'France - Germany': '1', 'Spain - Italia': '1'},
{'France - Germany': '1', 'Spain - Italia': 'X'},
{'France - Germany': '1', 'Spain - Italia': '2'},
{'France - Germany': 'X', 'Spain - Italia': '1'},
{'France - Germany': 'X', 'Spain - Italia': 'X'},
{'France - Germany': 'X', 'Spain - Italia': '2'},
{'France - Germany': '2', 'Spain - Italia': '1'},
{'France - Germany': '2', 'Spain - Italia': 'X'},
{'France - Germany': '2', 'Spain - Italia': '2'}]
对于给定的游戏列表,我们可以为此使用 itertools.product
:
from itertools import product
def game_product(games):
for i, res in enumerate(product('1x2', repeat=len(games)), 1):
print(i)
for gr in zip(games, res):
print('{} {}'.format(*gr))
例如:
>>> game_product(['France - Germany', 'Spain - Italia', 'Brazil - Spain'])
1
France - Germany 1
Spain - Italia 1
Brazil - Spain 1
2
France - Germany 1
Spain - Italia 1
Brazil - Spain x
3
France - Germany 1
Spain - Italia 1
Brazil - Spain 2
4
France - Germany 1
Spain - Italia x
Brazil - Spain 1
5
France - Germany 1
Spain - Italia x
Brazil - Spain x
6
France - Germany 1
Spain - Italia x
Brazil - Spain 2
7
France - Germany 1
Spain - Italia 2
Brazil - Spain 1
8
France - Germany 1
Spain - Italia 2
Brazil - Spain x
9
France - Germany 1
Spain - Italia 2
Brazil - Spain 2
10
France - Germany x
Spain - Italia 1
Brazil - Spain 1
11
France - Germany x
Spain - Italia 1
Brazil - Spain x
12
France - Germany x
Spain - Italia 1
Brazil - Spain 2
13
France - Germany x
Spain - Italia x
Brazil - Spain 1
14
France - Germany x
Spain - Italia x
Brazil - Spain x
15
France - Germany x
Spain - Italia x
Brazil - Spain 2
16
France - Germany x
Spain - Italia 2
Brazil - Spain 1
17
France - Germany x
Spain - Italia 2
Brazil - Spain x
18
France - Germany x
Spain - Italia 2
Brazil - Spain 2
19
France - Germany 2
Spain - Italia 1
Brazil - Spain 1
20
France - Germany 2
Spain - Italia 1
Brazil - Spain x
21
France - Germany 2
Spain - Italia 1
Brazil - Spain 2
22
France - Germany 2
Spain - Italia x
Brazil - Spain 1
23
France - Germany 2
Spain - Italia x
Brazil - Spain x
24
France - Germany 2
Spain - Italia x
Brazil - Spain 2
25
France - Germany 2
Spain - Italia 2
Brazil - Spain 1
26
France - Germany 2
Spain - Italia 2
Brazil - Spain x
27
France - Germany 2
Spain - Italia 2
Brazil - Spain 2