简体   繁体   English

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

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

I have a list containing ['a', 'bill', 'smith'] and I would like to write a python code in order to obtain all possible combinations applying a certain criteria.我有一个包含['a', 'bill', 'smith']的列表,我想编写一个 python 代码,以获得应用特定标准的所有可能组合。 To be more precise, I would like to obtain combination of those three element in the list plus the first letter of each element if that element isn't yet present in the output list.更准确地说,如果 output 列表中尚不存在该元素,我想获得列表中这三个元素的组合加上每个元素的第一个字母。 For example, given the list ['a', 'bill', 'smith'] , one part of the expected output would be: ['a', 'bill', 'smith'], ['bill', 'smith'], ['a', 'smith'] but as well, ['a', 'b, 'smith'], ['bill, 's'], ['a', 's'] .例如,给定列表['a', 'bill', 'smith'] ,预期 output 的一部分将是: ['a', 'bill', 'smith'], ['bill', 'smith'], ['a', 'smith']但也有['a', 'b, 'smith'], ['bill, 's'], ['a', 's'] What I'm not expected to obtain is output like this ['s', 'bill, 'smith'] as the first element (s) is already taken into account by the third element ('smith').我不希望得到的是 output 这样['s', 'bill, 'smith']作为第一个元素(s)已经被第三个元素('smith')考虑在内。 Can someone help me?有人能帮我吗?

This is what I've done so far:这是我到目前为止所做的:

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']}

I'm now stucked.我现在被困住了。 I would like to use itertools library to iterate over the dict values to create all possible combinations.我想使用 itertools 库来迭代 dict 值以创建所有可能的组合。

Thanks in advance:)提前致谢:)

You can use some itertools :您可以使用一些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')

The first step creates the list of equivalent lists:第一步创建等效列表的列表:

[['a'], ['bill', 'b'], ['s', 'smith']]

then, product produces the cartesian product of the lists in said lists:然后, product生成所述列表中列表的笛卡尔积:

('a', 'bill', 's')
('a', 'bill', 'smith')
('a', 'b', 's')
...

and for each of those, permutations gives you, well, all permutations:对于其中的每一个, permutations都会为您提供所有排列:

('a', 'bill', 's')
('a', 's', 'bill')
('bill', 'a', 's')
...

You could do something like this with combinations from itertools :您可以使用来自itertoolscombinations来做这样的事情:

Here I am assuming you want the first letter of each word in the list only if it has a length greater than 1. If not you can change the if condition.在这里,我假设您只希望列表中每个单词的第一个字母的长度大于 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: 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']

Here if you want combinations to be of length 3 only remove the for loop with range and set r=3 .在这里,如果您希望组合的长度为3 ,则只需删除带有rangefor loop并设置r=3

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

相关问题 如何在 python 中获得两个列表的所有可能组合 - How to get all possible combination of two list in python 获取具有重复值的列表的所有组合 - Get all combination of list with repeated values 如何从python中的二维列表中获取所有可能的项目组合? - how to get all possible combination of items from 2-dimensional list in python? 从 python 中的给定单词列表创建所有可能组合的列表 - creating a list of all possible combination from a given list of words in python 根据Python中数据框中的条件创建包含所有唯一可能组合的列表 - Create list with all unique possible combination based on condition in dataframe in Python Python:从具有字符限制的列表中生成所有可能的序列组合 - Python: Produce all possible sequence combination from a list with character limit 在 python 列表中查找所有可能的组合,每次都跳过一个项目 - Find all possible combination in a python list skipping an item each time 使用 Python 在一个巨大的列表中迭代所有可能的组合 - iterate all possible combination in a huge list using Python python中嵌套列表的可能组合 - Possible combination of a nested list in python 枚举二进制变量的所有可能的值组合 - Enumerating all possible combination of values for binary variables
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM