产生指数越来越长的组合,然后利用那些用缩写来代替名字:
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