繁体   English   中英

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

[英]Get all possible combination of values in a list — Python

我有一个包含['a', 'bill', 'smith']的列表,我想编写一个 python 代码,以获得应用特定标准的所有可能组合。 更准确地说,如果 output 列表中尚不存在该元素,我想获得列表中这三个元素的组合加上每个元素的第一个字母。 例如,给定列表['a', 'bill', 'smith'] ,预期 output 的一部分将是: ['a', 'bill', 'smith'], ['bill', 'smith'], ['a', 'smith']但也有['a', 'b, 'smith'], ['bill, 's'], ['a', 's'] 我不希望得到的是 output 这样['s', 'bill, 'smith']作为第一个元素(s)已经被第三个元素('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 值以创建所有可能的组合。

提前致谢:)

您可以使用一些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')
...

您可以使用来自itertoolscombinations来做这样的事情:

在这里,我假设您只希望列表中每个单词的第一个字母的长度大于 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))

OUTPUT:

['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 ,则只需删除带有rangefor loop并设置r=3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM