我正在尝试使用itertools.combinations返回唯一组合.我已经搜索了几个类似的问题,但未能找到答案.
一个例子:
>>> import itertools
>>> e = ['r','g','b','g']
>>> list(itertools.combinations(e,3))
[('r', 'g', 'b'), ('r', 'g', 'g'), ('r', 'b', 'g'), ('g', 'b', 'g')]
就我而言,(r,g,b)与(r,b,g)相同,因此我只想返回(rgb),(rgg)和(gbg).
这只是一个说明性示例,我想忽略所有此类“重复项”.列表e最多可以包含5个元素.每个单独的元素可以是r,g或b.总是从e寻找3个元素的组合.
具体来说,以下是我希望称为“有效”的唯一组合:(rrr),(ggg),(bbb),(rgb).
因此,问题可能归结为如何将(rgb)的任何变化都等同于(rgb)并因此将其忽略.
我可以使用itertools来实现这一目标,还是需要编写自己的代码以在此处删除“重复项”?如果没有itertools解决方案,那么我可以轻松地检查每个变量是否都是(rgb)的变体,但这有点“不合Python”.
解决方法:
根据您对“有效输出”的定义,您可以像这样直接构建它们:
from collections import Counter
# Your distinct values
values = ['r', 'g', 'b']
e = ['r','g','b','g', 'g']
count = Counter(e)
# Counter({'g': 3, 'r': 1, 'b': 1})
# If x appears at least 3 times, 'xxx' is a valid combination
combinations = [x*3 for x in values if count[x] >=3]
# If all values appear at least once, 'rgb' is a valid combination
if all([count[x]>=1 for x in values]):
combinations.append('rgb')
print(combinations)
#['ggg', 'rgb']
这比创建所有可能的组合并随后过滤有效组合更为有效.