我有一个包含['a', 'bill', 'smith']
的列表,我想编写一个python代码,以便获得使用特定条件的所有可能组合。更准确地说,如果输出列表中还没有该元素,我想获得列表中这三个元素加上每个元素的首字母的组合。例如,给定列表['a', 'bill', 'smith']
,预期输出的一部分将是:['a', 'bill', 'smith'], ['bill', 'smith'], ['a', 'smith']
,但是['a', 'b, 'smith'], ['bill, 's'], ['a', 's']
也是如此。由于第一个元素已经被第三个元素(“史密斯”)考虑在内,因此我无法获得像['s', 'bill, 'smith']
这样的输出。有人可以帮我吗?
这是我到目前为止所做的:
mapping = dict(enumerate(['a', 'bill', 'smith']))
for i in mapping.items():
if len(i[1])>1:
mapping[i[0]] = [i[1], i[1][0]]
else:
mapping[i[0]] = [i[1]]
print(mapping)
{0: ['a'], 1: ['bill', 'b'], 2: ['william', 'w'], 3: ['stein', 's']}
我现在被困住了。我想使用itertools库对dict值进行迭代以创建所有可能的组合。
预先感谢:)
答案 0 :(得分:1)
您可以使用一些itertools
:
from itertools import product, permutations
lst = [list({s, s[:1]}) for s in ['a', 'bill', 'smith']]
# [['a'], ['bill', 'b'], ['s', 'smith']]
for perms in map(permutations, product(*lst)):
for p in perms:
print(p)
('a', 'bill', 's')
('a', 's', 'bill')
('bill', 'a', 's')
('bill', 's', 'a')
('s', 'a', 'bill')
('s', 'bill', 'a')
('a', 'bill', 'smith')
('a', 'smith', 'bill')
('bill', 'a', 'smith')
('bill', 'smith', 'a')
('smith', 'a', 'bill')
('smith', 'bill', 'a')
('a', 'b', 's')
('a', 's', 'b')
('b', 'a', 's')
('b', 's', 'a')
('s', 'a', 'b')
('s', 'b', 'a')
('a', 'b', 'smith')
('a', 'smith', 'b')
('b', 'a', 'smith')
('b', 'smith', 'a')
('smith', 'a', 'b')
('smith', 'b', 'a')
第一步创建等效列表的列表:
[['a'], ['bill', 'b'], ['s', 'smith']]
然后,product
产生所述列表中列表的笛卡尔积:
('a', 'bill', 's')
('a', 'bill', 'smith')
('a', 'b', 's')
...
对于其中的每个,permutations
为您提供所有排列:
('a', 'bill', 's')
('a', 's', 'bill')
('bill', 'a', 's')
...
答案 1 :(得分:0)
您可以使用combinations
中的itertools
做类似的事情:
在这里,我假设只有长度大于1的单词才需要列表中每个单词的第一个字母。否则,您可以更改if条件。
from itertools import combinations
lst = ['a', 'bill', 'smith']
lst_n=[]
for words in lst:
lst_n.append(words)
if len(words)>1:
lst_n.append(words[0])
for t in range(1,len(lst_n)+1):
for comb in combinations(lst_n,r=t):
print(list(comb))
输出:
['a']
['bill']
['b']
['smith']
['s']
['a', 'bill']
['a', 'b']
['a', 'smith']
['a', 's']
['bill', 'b']
['bill', 'smith']
['bill', 's']
['b', 'smith']
['b', 's']
['smith', 's']
['a', 'bill', 'b']
['a', 'bill', 'smith']
['a', 'bill', 's']
['a', 'b', 'smith']
['a', 'b', 's']
['a', 'smith', 's']
['bill', 'b', 'smith']
['bill', 'b', 's']
['bill', 'smith', 's']
['b', 'smith', 's']
['a', 'bill', 'b', 'smith']
['a', 'bill', 'b', 's']
['a', 'bill', 'smith', 's']
['a', 'b', 'smith', 's']
['bill', 'b', 'smith', 's']
['a', 'bill', 'b', 'smith', 's']
如果您希望组合的长度为3
,请仅将for loop
替换为range
并设置r=3
。