这是我的第一个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(),如何将值eg[(0,1)]设为键,并为此键分配一个随机值?
a)使用索引:
b)我不能百分之百地理解这个问题,但是您可以使用
list(itertools.combinations(...))
,而不是像您所做的那样使用列表理解c)我认为你误解了
map()
的作用。map(str, [1, 2, 3])
相当于:如果你想给} 模块:
[(0, 1)]
一个值,你可以使用字典,但是你必须使用(0, 1)
而不是[(0, 1)]
,因为否则你会得到TypeError: unhashable type: 'list'
。如果您想要一个“随机值”,我想您可以使用^{要将所有输出存储在一个列表中,可以使用大量列表理解:
我最初是作为评论发表的,但我认为这确实是一个答案。
您误用了
itertools.combinations
,这妨碍了您以方便的方式获取数据的能力。itertools.combination(range(k, r), r-k)
总是会产生正好一个值,range(k,r)
。这是不必要的;你应该直接使用范围。然而,用于生成
k
和if
值的k
和r
语句是一个组合。您可以使用for k, r in itertools.combinations(range(items+1), 2)
,而不是原始代码中的三个级别的语句。我怀疑您在代码中输入itertools.combinations
调用时试图这样做,但结果却放错了位置。因此,要最终解决实际问题:要访问数据,您需要将所有项放入单个数据结构中,而不是打印它们。列表理解是一种简单的方法,特别是当你简化了生成它们的逻辑之后,正如我在上面建议的更改所做的那样:
如果需要访问各个项,可以使用索引进入
results
列表,然后根据需要进入其成员列表。相关问题 更多 >
编程相关推荐