这是我的第一个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]]作为键,并为该键指定一个随机值?
< / LI>答案 0 :(得分: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,)]]
答案 1 :(得分:0)
我最初将此作为评论发布,但我认为这确实是一个答案。
您误用itertools.combinations
,这会妨碍您以方便的方式获取数据。 itertools.combination(range(k, r), r-k)
始终只会产生一个值range(k,r)
。那是不必要的;你应该直接使用这个范围。
但是,用于生成for
和if
值的k
和r
语句是的组合。您可以使用for 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