【问题标题】:Create combinations from a list and 3 ranges using itertools使用 itertools 从列表和 3 个范围创建组合
【发布时间】:2018-02-03 04:45:56
【问题描述】:

我有以下:

a_list = [A,B,C]
r1 = range(1,5)
r2 = range(1,5)
r3 = range(1,5)

我希望能够根据范围找到此列表中元素的各种组合。例如:

combi1 = [A, B, C, C, C]
combi2 = [A, A, B, C, C]
combi3 = [A, A, A, B, C]
combi4 = [A, B, B, C, C]

等等

如果只有 2 个range,我可以这样做,但我不确定如何放入 3 个range。

inc = range(1, 5)
desc = range(5, 1, -1)
combis = [list(itertools.chain(*(itertools.repeat(elem, n) for elem, n in zip(list, [i,j])))) for i,j in zip(inc,desc)]  

解决方案:

def all_exist(avalue, bvalue):
    return all(any(x in y for y in bvalue) for x in avalue)

combins = itertools.combinations_with_replacement(a_list, 5)
combins_list = [list(i) for i in combins]
for c in combins_list:
    if all_exist(a_list, c) == True:
        print c

输出:

['A', 'A', 'A', 'B', 'C']
['A', 'A', 'B', 'B', 'C']
['A', 'A', 'B', 'C', 'C']
['A', 'B', 'B', 'B', 'C']
['A', 'B', 'B', 'C', 'C']
['A', 'B', 'C', 'C', 'C']

【问题讨论】:

  • 您能否详细说明您是如何得出输出列表的?
  • 也许从 展开 开始,将其理解为嵌套的 for 循环,以便于查看。并提供该理解正在做什么或应该做什么的书面描述。
  • 请更正示例代码中的错误。
  • 我真的看不到,将列表与三个范围连接起来的操作是什么。如果一个范围从 1 增加到 4,第二个范围从 5 减少到 2,那么第三个范围应该代表什么?您的示例代码没有帮助。它会生成包含六个元素的列表,然后用变量 list 覆盖内置函数 list()。

标签: python python-2.7 combinations


【解决方案1】:

@doyz。我认为这可能是您正在寻找的:

从列表abc = ['A','B','C'] 中,您想获得它的各种替换组合。 Python 内置了itertools 来执行此操作。

import itertools

abc = ['A', 'B', 'C'];

combins = itertools.combinations_with_replacement(abc, 5);
combins_list = [list(i) for i in combins];

print(combins_list[0:10]);

这是前 10 个替换组合:

[['A', 'A', 'A', 'A', 'A'], ['A', 'A', 'A', 'A', 'B'], ['A', 'A', 'A', 'A', 'C'], \
 ['A', 'A', 'A', 'B', 'B'], ['A', 'A', 'A', 'B', 'C'], ['A', 'A', 'A', 'C', 'C'], \
['A', 'A', 'B', 'B', 'B'], ['A', 'A', 'B', 'B', 'C'], ['A', 'A', 'B', 'C', 'C'], ['A', 'A', 'C', 'C', 'C']]

如果你想在abc 中包含所有元素,这里有一种方法,它也包含排列:

import itertools
abc = ['A', 'B', 'C']; 
combins = itertools.combinations_with_replacement(abc, 5); 
combins_list = list(combins);
combins_all =[];
for i in combins_list:
    if len(set(i))==len(abc):
        combins_all.append(i);
print(combins_all);

include_permutations=[];
for i in combins_all:
    permut = list(itertools.permutations(i));
    include_permutations.append(permut);
print(include_permutations);

这样好吗?

*注意:itertools.combinations_woth_replacement 和 itertools.permutations 不会产生一个列表或元组,而是一个不同的对象本身,所以你不能把它当作那些。

【讨论】:

  • 嘿@Arief,谢谢!但我希望每个项目 A、B、C 至少出现在组合列表中一次,这意味着不可能全部为 As,或 4As 和 1B
  • 嘿@Arief,我设法用上面的解决方案修复了它。感谢您的帮助!
  • @doyz 不错。我编辑了答案,但忘了通知你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
相关资源
最近更新 更多