2017-04-17 91 views
0

不確定如何在標題中以特殊方式表示。但是,讓我們說,我有這樣的元組:將元組劃分爲多個子元組 - Python

[['a',2,3],['a',4,5],['b',10,20],['b',30,40],['a',5,6]] 

如何劃分這個解析成兩個元:

a = [[2,3],[4,5],[5,6]] 
b = [[10,20],[30,40]] 
+4

這些被稱爲列表btw –

+1

你有什麼試過,究竟是什麼問題呢?用字母「a」和「b」可能會更好。 – jonrsharpe

回答

1

假設'a''b'是值得被硬編碼有意義的常數,一個簡單的解決方案:

arr = [['a',2,3],['a',4,5],['b',10,20],['b',30,40],['a',5,6]] 
a = [l[1:] for l in arr if l[0] == 'a'] 
b = [l[1:] for l in arr if l[0] == 'b'] 

如果需要一個比較通用代碼:

from collections import defaultdict 

arr = [['a',2,3],['a',4,5],['b',10,20],['b',30,40],['a',5,6]] 

d = defaultdict(list) 
for l in arr: 
    d[l[0]].append(l[1:]) 
0

你可以做,使用列表理解:

>>> l = [['a',2,3],['a',4,5],['b',10,20],['b',30,40],['a',5,6]] 

>>> a = [x[1:] for x in l if x[0] == "a"] 

>>> a 
[[2, 3], [4, 5], [5, 6]] 

>>> b = [x[1:] for x in l if x[0] == "b"] 

>>> b 
[[10, 20], [30, 40]] 

>>> 

您需要遍歷在主列表中的元素(子表)。對於每個子列表,我們檢查第一個項目。如果第一項是ab,那麼我們對子列表進行切片並僅取整數部分。

0

正如jonrsharpe所說,將這些列表存儲在字典中可能更有用。使用字典將子列表以您想要的方式進行劃分很容易,可以將列表作爲以字符串爲鍵的值累積到列表中。當然,如果你真的想要的話,你可以將結果列表綁定到不同的名字上。

seq = [['a', 2, 3], ['a', 4, 5], ['b', 10, 20], ['b', 30, 40], ['a', 5, 6]] 
d = {} 
for k, *u in seq: 
    d.setdefault(k, []).append(u) 

print(d) 
a = d['a'] 
b = d['b'] 
print(a) 
print(b) 

輸出

{'a': [[2, 3], [4, 5], [5, 6]], 'b': [[10, 20], [30, 40]]} 
[[2, 3], [4, 5], [5, 6]] 
[[10, 20], [30, 40]] 

for k, *u in seq:在每個子列表中的串結合k,存儲該子列表作爲u的剩餘部分。然後,我們將u子列表附加到字典d的相應列表中。

+0

謝謝!將列表存儲到字典中可能是我正在工作的最優雅的解決方案。 – user3150126