在Python中提取list元素

2024-03-28 19:49:02 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的第一个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)]设为键,并为此键分配一个随机值?


Tags: in程序元素列表forifitemsrange
2条回答
  • a)使用索引:

    >>> [(1, 2, 3)][0][0]
    1
    
  • b)我不能百分之百地理解这个问题,但是您可以使用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'。如果您想要一个“随机值”,我想您可以使用^{}模块:

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,)]]

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

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

然而,用于生成kif值的kr语句是一个组合。您可以使用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

相关问题 更多 >