您可以使用字典,以收集預期的對。而作爲一個更Python的方法,你可以使用defaultdict()
和deque
功能從collections
模塊,以保持每對有關對在deque
:
>>> from collections import defaultdict, deque
>>> d = defaultdict(deque)
>>> for i, j in li:
... for k, t in li:
... if (i, j) != (k, t) and (i == t or j == k):
... d[(i, j)].append((k, t))
...
>>>
>>> d
defaultdict(<type 'collections.deque'>,
{('dd', 'ee'): deque([('ee', 'mm')]),
('rr', 'cc'): deque([('cc', 'tt')]),
('cc', 'tt'): deque([('bb', 'cc'), ('rr', 'cc')]),
('aa', 'bb'): deque([('bb', 'cc')]),
('ee', 'mm'): deque([('dd', 'ee')]),
('bb', 'cc'): deque([('aa', 'bb'), ('cc', 'tt')])})
和創建你可以使用一個元組的願望清單列表理解,通過循環詞典詞條:
>>> [[(k, v) for v in values] for k, values in d.items()]
[[(('dd', 'ee'), ('ee', 'mm'))], [(('rr', 'cc'), ('cc', 'tt'))], [(('cc', 'tt'), ('bb', 'cc')), (('cc', 'tt'), ('rr', 'cc'))], [(('aa', 'bb'), ('bb', 'cc'))], [(('ee', 'mm'), ('dd', 'ee'))], [(('bb', 'cc'), ('aa', 'bb')), (('bb', 'cc'), ('cc', 'tt'))]]
注意,你可以簡單地使用list
爲您defaultdict
的功能,如果你不想做的結果沒有任何額外的操作,但是如果你想要做的更多的操作結果就像彈出,在兩邊追加,旋轉等。deque
是一個不錯的選擇,因爲它爲大多數操作提供了不變的順序。
更簡潔的方式通過itertools.permutations
:
>>> from itertools import permutations
>>> for i, j permutations(li, 2):
... if (i == t or j == k):
... d[(i, j)].append((k, t))
「拓撲排序」 –
怎麼樣重複的情況下,和元組可以匹配兩種情況? – Kasramvd
@Kasramvd在'li'中沒有重複,但是每個元素都可以與許多其他元素相匹配。 – Hatshepsut