2014-11-22 61 views
2

我有一個數組,創建子陣列形成基於所述大型陣列的第一元件上的大陣列

list = [['a', '2', '7'], ['b', '2', '9'],['a', '1', '4'],['c', '6', '1'],['b', '9', '9'],['a', '3', '2'],['c', '1', '5'],['b', '3', '7']] 

我可以寫:

aList = [[row [1], row [2]] for row in list if row [0] == "a"] 
bList = [[row [1], row [2]] for row in list if row [0] == "b"] 
cList = [[row [1], row [2]] for row in list if row [0] == "c"] 

做出的一個子陣列第二和第三個元素具有特定的第一個元素,即'a','b'或'c'。 但我想知道如何編寫一個代碼來完成所有第一個元素的工作。

+0

您能添加一個預期輸出的例子嗎?我不確定我是否明白你想要什麼。 – Alec 2014-11-22 21:04:13

+0

這是一個不是數組的列表。 – 2014-11-22 21:11:52

回答

2

使用字典與第一項目爲重點和項目,如值的其餘部分。 collections.defaultdict將使這一任務變得更容易一些對你來說,你可以使用純dict以及做到這一點:

>>> from collections import defaultdict 
>>> lst = [['a', '2', '7'], ['b', '2', '9'],['a', '1', '4'],['c', '6', '1'],['b', '9', '9'],['a', '3', '2'],['c', '1', '5'],['b', '3', '7']] 
>>> d = defaultdict(list) 
>>> for x in lst: 
     d[x[0]].append(x[1:]) 
     #For plain dict this is going to be: 
     #d.setdefault(x[0], []).append(x[1:]) 

>>> d['a'] 
[['2', '7'], ['1', '4'], ['3', '2']] 
>>> d['b'] 
[['2', '9'], ['9', '9'], ['3', '7']] 
>>> d['c'] 
[['6', '1'], ['1', '5']] 
1
import operator 

L = [['a', '2', '7'], ['b', '2', '9'],['a', '1', '4'],['c', '6', '1'],['b', '9', '9'],['a', '3', '2'],['c', '1', '5'],['b', '3', '7']] 

lists = {'a':[], 'b':[], 'c':[]} 
g = operator.itemgetter(1,2) 
for t in L: 
    lists[t[0]].append(g(t)) 

print('aList:', lists['a']) 
print('bList:', lists['b']) 
print('cList:', lists['c']) 

輸出:

aList: [('2', '7'), ('1', '4'), ('3', '2')] 
bList: [('2', '9'), ('9', '9'), ('3', '7')] 
cList: [('6', '1'), ('1', '5')] 
0

字典能爲你做這項工作。

dict_list = {} 
for row in list: 
    dict_list.setdefault(row[0],[]) 
    dict_list[row[0]].append(row[1:]) 

setdefault將設定值作爲空列表[]如果該鍵不存在。 輸出:

>>>dict_list 
{'a': [['2', '7'], ['1', '4'], ['3', '2']], 
'c': [['6', '1'], ['1', '5']], 
'b': [['2', '9'], ['9', '9'], ['3', '7']]} 
+0

非常感謝。我確信這是一個愚蠢的問題,但是當我用我的原始列表嘗試代碼時,我得到以下錯誤消息:「AttributeError:'str'object has no attribute'append'」...我該怎麼辦? – Mac 2014-11-23 00:27:43