获取列表中所有可能的值组合-Python

时间:2020-06-23 13:04:18

标签: python python-3.x combinations itertools

我有一个包含['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值进行迭代以创建所有可能的组合。

预先感谢:)

2 个答案:

答案 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