Vel*_*les 54 python grouping list
假设我有一个这样的列表:
list = [["A",0], ["B",1], ["C",0], ["D",2], ["E",2]]
Run Code Online (Sandbox Code Playgroud)
我怎样才能最优雅地将其分组以在Python中获取此列表输出:
list = [["A", "C"], ["B"], ["D", "E"]]
Run Code Online (Sandbox Code Playgroud)
所以这些值按secound值分组但订单仍然保留......
How*_*ard 83
values = set(map(lambda x:x[1], list))
newlist = [[y[0] for y in list if y[1]==x] for x in values]
Run Code Online (Sandbox Code Playgroud)
eyq*_*uem 29
from operator import itemgetter
from itertools import groupby
lki = [["A",0], ["B",1], ["C",0], ["D",2], ["E",2]]
lki.sort(key=itemgetter(1))
glo = [[x for x,y in g]
for k,g in groupby(lki,key=itemgetter(1))]
print glo
Run Code Online (Sandbox Code Playgroud)
.
编辑
另一个不需要导入的解决方案,更具可读性,保留订单,并且比前一个解决方案长22%:
oldlist = [["A",0], ["B",1], ["C",0], ["D",2], ["E",2]]
newlist, dicpos = [],{}
for val,k in oldlist:
if k in dicpos:
newlist[dicpos[k]].extend(val)
else:
newlist.append([val])
dicpos[k] = len(dicpos)
print newlist
Run Code Online (Sandbox Code Playgroud)
Rob*_*ney 22
霍华德的答案简洁而优雅,但在最坏的情况下也是O(n ^ 2).对于具有大量分组键值的大型列表,您需要先对列表进行排序,然后使用itertools.groupby:
>>> from itertools import groupby
>>> from operator import itemgetter
>>> seq = [["A",0], ["B",1], ["C",0], ["D",2], ["E",2]]
>>> seq.sort(key = itemgetter(1))
>>> groups = groupby(seq, itemgetter(1))
>>> [[item[0] for item in data] for (key, data) in groups]
[['A', 'C'], ['B'], ['D', 'E']]
Run Code Online (Sandbox Code Playgroud)
编辑:
看到eyequem的答案之后,我改变了这个: itemgetter(1)比...更好lambda x: x[1].
>>> import collections
>>> D1 = collections.defaultdict(list)
>>> for element in L1:
... D1[element[1]].append(element[0])
...
>>> L2 = D1.values()
>>> print L2
[['A', 'C'], ['B'], ['D', 'E']]
>>>
Run Code Online (Sandbox Code Playgroud)