【发布时间】: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