2014-11-22 87 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