有 1到14 这14个数字,要求排列组合成 一个列表S, 列表S中 包含14个 元素A, 每个元素 都是一个 包含 7 个数字对的 列表, 就像这样
S = [A1, A2, A3 ... A14] A1 = [(1,2), (3,4) ... (13, 14)]
要求是 在每个元素A中, 这14个数字 各出现一次, 并且只出现一次 在整个 S中, 没有 重复的 数字对。 比如 (4, 8) 出现了 两个以上的元素中, 这是不允许的。
请生成这样的列表S
| #!/usr/bin/env python | |
| # -*- coding: utf-8 -*- # | |
| import unittest | |
| class TestIt(unittest.TestCase): | |
| nums = range(1, 15) | |
| count = len(nums) | |
| def test_get_result(self): | |
| res = get_result() | |
| all_pairs = [] | |
| self.assertTrue(len(res) > 0) | |
| for a in res: | |
| print a | |
| m, n = zip(*a) | |
| tl = list(m + n) | |
| tl.sort() | |
| self.assertEqual(len(tl), self.count) | |
| self.assertEqual(set(tl), set(self.nums)) | |
| all_pairs.extend(a) | |
| self.assertEqual(len(all_pairs), len(set(all_pairs))) | |
| print 'Total:', len(res) | |
| def get_result(): | |
| a = [(l, k) for k in range(1,15) for l in range(1,15) if k!=l] | |
| result = [] | |
| for l in range(40): | |
| tmpset = set() | |
| tmplist = [] | |
| for col in range(7): | |
| for thedate in a: | |
| if len(tmpset & set(thedate)) == 0: | |
| tmplist.append(thedate) | |
| tmpset = tmpset|set(thedate) | |
| a.remove(thedate) | |
| if len(tmplist) == 7: | |
| tmplist.sort() | |
| result.append(tmplist) | |
| else: | |
| a.extend(tmplist) | |
| if len(result) == 14: | |
| break | |
| return result | |
| if __name__ == '__main__': | |
| unittest.main() |