2017-04-17 104 views
0

我有3個列表,我以特定的方式(使用izip)進行組合。那麼我正在對元組的列表進行計算。但是,一旦計算完成,我需要'撤消'這個操作來獲取原始列表(儘管有些值已更改)。有沒有一個簡單的pythonic這樣做?從Python中的元組列表2.7解壓縮項目

grouped = [] 

med_done = 0 
lrg_done = 0   

#While items exist in small, pair up one item from each list 
grouped.extend(list(izip(sml,med,lrg))) 

done = len(sml) 

# While items remain in med, pair up one from med an two from lrg 
grouped.extend(list(izip(med[done:],lrg[done::2],lrg[(done+1)::2]))) 

done = done + (2*(len(med)-len(sml))) 

# Finish pairing up remaining items from lrg 
grouped.extend(list(izip_longest(lrg[done::3],lrg[(done+1)::3],lrg[(done+2)::3],fillvalue = '-')))  

這將產生:

smlBinary:[6 6 7 7 7 8 6 8 7] 

medBinary:[4 3 4 3 3 3 5 5 4 5 3 5 3 3 4 4] 

lrgBinary:[0 1 2 0 0 2 1 1 1 1 1 2 2 2 0 2 2 1 2 1 2 1 0 1 2 1 0 2 1 2 0 1 0 1 0 1] 

Grouped[(6, 4, 0), (6, 3, 1), (7, 4, 2), (7, 3, 0), (7, 3, 0), (8, 3, 2), (6, 5, 1), (8, 5, 1), (7, 4, 1), (5, 0, 1), (3, 2, 0), (5, 0, 2), (3, 1, 1), (3, 1, 1), (4, 1, 2), (4, 2, 2), (1, 2, 1), (0, 2, 1), (2, 0, 1), (0, 1, 0), (1, '-', '-')] 

問題: 現在是不是也有類似的技術,我可以用「解除配對」這些物品回去拿原來的名單?

回答

0

所以,如果我的理解正確,你只需要將元組拆分成列表?不知道很多關於izip,但它看起來像你可以只用幾個列表內涵做到這一點:

sm_out = [tup[0] for tup in grouped] 
med_out = [tup[1] for tup in grouped] 
lg_out = [tup[2] for tup in grouped] 
+0

Hi @Anddrrw,如果它被均勻配對,你的方法可以很好地工作,但配對工作的方式意味着我不能在整個「分組」列表中使用單一方法。至少它必須分三部分完成。 –

1

可以使用的可變參數的組合和ZIP功能解壓。

unzipped = zip(*zipped) 

哪裏zipped是你grouped變量。

+0

嗨@EyuelDK,是的,我希望能夠使用類似的東西,但是我需要像3部分一樣做izip部分,但不使用循環。 –

+0

我不明白你的評論,但在你的情況下,'解壓縮'應該成爲長度爲3的數組,其中每個數組是原始數據,即sml,med,lrg。 – EyuelDK

相關問題