0

Python 2.6 を使用しています。

私のコードはここで編集して実行できます: http://www.codeskulptor.org/#user12_OQL53Z5Es8yDHRB.py

# set the arguments
teams = 4
rounds = 2 * (teams - 1)

# show the arguments
print teams, "teams"
print rounds, "rounds"

# season is a list of lists
# each sub list is a round
season = rounds*["round"]

# store the first round in season[0]
round = range(1, teams + 1)
season[0] = round[:]

# store the other rounds in season
for j in range(1, rounds):
    round2 = round[:]
    round2[1] = round[teams - 1]
    for i in range(2, teams):
        round2[i] = round[i - 1]
    season[j] = round2[:] 
    round = round2

# print the season    
print season

4 つのチームがあり、全員が各チームを 2 回プレイする場合、[1, 2, 3, 4]、[1, 4, 2, 3]、[1, 3, 4, 2]、[1, 2、3、4]、[1、4、2、3]、[1、3、4、2]]。チーム 1 はその場にとどまり、他のチームはローテーションします。チーム 1 と、チーム 1 の次の位置に移動するリストの最後のチームを除いて、すべてのチームが 1 つ右に移動します。

上記のコードが機能すると思います。私は Python の初心者なので、より優れた、またはより洗練されたコードを探しています。

ありがとうございました!

4

2 に答える 2

1

より読みやすいバージョン:

[...]

first_round = range(1, teams + 1)
season = [first_round]

def rotate(round):
    return [round[0], round[-1]] + round[1:-1]

for i in range(0, rounds - 1):
    previous_round = season[i]
    season.append(rotate(previous_round))

print season
于 2013-05-09T09:57:27.197 に答える
1

を使用itertools.permutationsしてすべての順列を作成し、1 で始まる最初のセットを選択できます。

from itertools import permutations
from math import factorial

season = list(permutations(range(1, teams+1)))[:factorial(teams)/teams]

または、すべての順列を生成せずに、2 ~ 4 の順列を取得してから、1 に追加します。

season = [[1] + list(i) for i in permutations(range(2, teams+1))]
于 2013-05-09T09:57:49.497 に答える