[英]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
生成k
和r
值的for
和if
語句是一個組合。 您可以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.