簡體   English   中英

用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

對於另一個列表為['法國-德國','西班牙-意大利']的情況

  • 可能的結果數是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM