簡體   English   中英

在Python中提取列表元素

[英]Extract list element in 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(),如何將值[[0,1]]作為鍵,並為該鍵分配一個隨機值?

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

我最初將此作為評論發布,但我認為這確實是一個答案。

您誤用了itertools.combinations ,這會妨礙您以方便的方式獲取數據。 itertools.combination(range(k, r), rk)總是會產生一個值, range(k,r) 那是不必要的; 你應該直接使用范圍。

但是, for生成kr值的forif語句一個組合。 您可以for k, r in itertools.combinations(range(items+1), 2)使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM