產生指數越來越長的組合,然後利用那些用縮寫來代替名字:
from itertools import combinations
def replacements(names, initials):
for count in range(len(names)):
for positions in combinations(range(len(names)), count):
yield [initials[i] if i in positions else name for i, name in enumerate(names)]
yield initials
所以上面的第一個不替代anyt (length = 0
),然後替換一個元素(length = 1
,輸出[0]
,然後[1]
等),一直到3替換([0, 1, 2]
,[0, 1, 3]
等)。最後,我們輸出initials
,作爲「4替換」的情況。
演示:
>>> names = ['Elizabeth', 'Anne', 'Wells', 'Cannon']
>>> initials = ['E.', 'A.', 'W.', 'C.']
>>> for result in replacements(names, initials):
... print(result)
...
['Elizabeth', 'Anne', 'Wells', 'Cannon']
['E.', 'Anne', 'Wells', 'Cannon']
['Elizabeth', 'A.', 'Wells', 'Cannon']
['Elizabeth', 'Anne', 'W.', 'Cannon']
['Elizabeth', 'Anne', 'Wells', 'C.']
['E.', 'A.', 'Wells', 'Cannon']
['E.', 'Anne', 'W.', 'Cannon']
['E.', 'Anne', 'Wells', 'C.']
['Elizabeth', 'A.', 'W.', 'Cannon']
['Elizabeth', 'A.', 'Wells', 'C.']
['Elizabeth', 'Anne', 'W.', 'C.']
['E.', 'A.', 'W.', 'Cannon']
['E.', 'A.', 'Wells', 'C.']
['E.', 'Anne', 'W.', 'C.']
['Elizabeth', 'A.', 'W.', 'C.']
['E.', 'A.', 'W.', 'C.']
當然,而是採用了專用initials
列表,你可以只使用每次name[0] + '.'
剛剛生成初始。
到目前爲止,您嘗試過哪些方法,顯示了一些您嘗試解決問題的代碼? – aBiologist