在Python中提取列表元素

时间:2013-06-25 06:26:54

标签: python python-2.7

这是我的第一个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>

2 个答案:

答案 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)。那是不必要的;你应该直接使用这个范围。

但是,用于生成forifkr语句是的组合。您可以使用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