1

这是我的第一个 python 程序。我使用以下代码为给定范围生成组合。

for k in range(0, items+1):        
    for r in range(0, items+1):        
        if (r-k) > 0:
            res = [x for x in itertools.combinations(range(k, r), r-k)]            
            print res

假设 items=4,代码产生 10 个组合

            #     
            # [(0,)]
            # [(0, 1)]
            # [(0, 1, 2)]
            # [(0, 1, 2, 3)]
            # [(1,)]
            # [(1, 2)]
            # [(1, 2, 3)]
            # [(2,)]
            # [(2, 3)]
            # [(3,)]
            #

我的问题是

  • (a) 如何检索每个组合中的每个元素,比如说,在 [(1, 2, 3)] 中,我如何检索偏移量 0(即 1)处的值?

  • (b) 如何将 itertools.combinations 的返回值存储到“res”中的列表数组中(例如 res[0] = [(0,)] , res[1] = [(0, 1)] ?

  • (c) 假设我想使用 map(),我怎样才能将值例如 [(0, 1)] 作为键,并为该键分配一个随机值?

4

2 回答 2

4
  • a) 使用索引:

    >>> [(1, 2, 3)][0][0]
    1
    
  • b)我不是 100% 理解这个问题,但不是像你所做的那样使用列表理解,你可以使用list(itertools.combinations(...))

  • c)我认为你误解了什么map()map(str, [1, 2, 3])相当于:

    [str(i) for i in [1, 2, 3]]
    

如果你想给出[(0, 1)]一个值,你可以使用字典,但你必须使用(0, 1) 而不是,[(0, 1)]否则你会得到TypeError: unhashable type: 'list'. 如果你想要一个“随机值”,我想你可以使用该random模块:

import random
{(0, 1) : random.randint(1,10)} # This is just an example, of course

要将所有输出存储在一个列表中,您可以使用大量列表推导:

>>> [list(itertools.combinations(range(x, i), i-x)) for x in range(0, items+1) for i in range(0, items+1) if (i-x) > 0]
[[(0,)], [(0, 1)], [(0, 1, 2)], [(0, 1, 2, 3)], [(1,)], [(1, 2)], [(1, 2, 3)], [(2,)], [(2, 3)], [(3,)]]
于 2013-06-25T06:29:25.887 回答
0

我最初将此作为评论发布,但我认为这确实是一个答案。

你误用itertools.combinations了,它妨碍了你以方便的方式获取数据的能力。itertools.combination(range(k, r), r-k)总是会产生一个值,range(k,r)。那是不必要的;你应该直接使用范围。

但是,用于生成and值的forand语句一个组合。代替原始代码中的三级语句,您可以使用. 我怀疑您在将调用放入代码时试图这样做,但它最终出现在错误的位置。ifkrfor k, r in itertools.combinations(range(items+1), 2)itertools.combinations

因此,要最终解决您的实际问题:要访问您的数据,您需要将所有项目放入一个数据结构中,而不是打印它们。列表理解是一种简单的方法,尤其是在您简化了生成它们的逻辑后,正如我上面建议的更改所做的那样:

import itertools

items = 4

results = [range(k, r) for k,r in itertools.combinations(range(items+1),2)]
print results
# prints [[0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]

如果您需要访问单个项目,您可以在results列表中使用索引,然后根据需要对其成员列表进行索引。

print results[6]    # prints [1, 2, 3]
print results[6][0] # prints 1
于 2013-06-25T07:59:46.463 回答