【问题标题】:Get all possible combination of values in a list -- Python获取列表中所有可能的值组合——Python
【发布时间】:2020-06-23 13:04:18
【问题描述】:

我有一个包含['a', 'bill', 'smith'] 的列表,我想编写一个python 代码,以获得应用某个标准的所有可能组合。更准确地说,如果该元素尚未出现在输出列表中,我想获得列表中这三个元素的组合加上每个元素的第一个字母。例如,给定列表['a', 'bill', 'smith'],预期输出的一部分将是:['a', 'bill', 'smith'], ['bill', 'smith'], ['a', 'smith'],但同样,['a', 'b, 'smith'], ['bill, 's'], ['a', 's']。我不希望得到像这样的输出['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 工具简单地生成所有组合然后过滤掉您的标准认为多余的元素是否不可行?
  • 那么......如何说一个标准对于python来说是多余的?无论如何谢谢:) 但@schwobaseggl 解决了它

标签: python python-3.x combinations itertools


【解决方案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')
...

【讨论】:

  • 非常感谢!你救了我?
【解决方案2】:

你可以用来自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))

输出:

['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 looprange 并设置r=3

【讨论】:

  • 感谢您花时间帮助我,但我发现其他答案更有用:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
相关资源
最近更新 更多