我在Python中有这个列表列表:
[[100,XHS,0],
[100,34B,3],
[100,42F,1],
[101,XHS,2],
[101,34B,5],
[101,42F,2],
[102,XHS,1],
[102,34B,2],
[102,42F,0],
[103,XHS,0],
[103,34B,4],
[103,42F,2]]
我希望找到最有效的方法(我正在处理大量数据),使用每个id(第一个元素)的每个列表中的最后一个元素创建一个新的列表列表。 因此,对于上面的示例列表,我的结果将是:
[[0,3,1],
[2,5,2],
[1,2,0],
[0,4,2]]
我如何在Python中实现它?感谢
答案 0 :(得分:8)
一个遍历构造块的itertools方法 - 获取最后的元素,分组成三个,将3个组转换为列表...
from operator import itemgetter
from itertools import imap, izip
last_element = imap(itemgetter(-1), a)
in_threes = izip(*[iter(last_element)] * 3)
res = map(list, in_threes)
# [[0, 3, 1], [2, 5, 2], [1, 2, 0], [0, 4, 2]]
但是,看起来你想在第一个元素上“分组”(而不是纯粹的3个连续项块),所以你可以使用defaultdict
来实现这个目的:
from collections import defaultdict
dd = defaultdict(list)
for el in a:
dd[el[0]].append(el[-1])
# defaultdict(<type 'list'>, {100: [0, 3, 1], 101: [2, 5, 2], 102: [1, 2, 0], 103: [0, 4, 2]})
答案 1 :(得分:2)
new_list = []
temp_list = []
counter = 1
for x in list:
temp_list.extend(x[-1])
if ((counter % 3) == 0):
new_list.append(temp_list)
temp_list = []
counter += 1
print new_list
答案 2 :(得分:2)
你正试图在这里做两个事情:
您可以使用列表推导来获取每个嵌套列表的最后一个元素:
last_elems = [sublist[-1] for sublist in outerlist]
如果整个列表按第一个元素(id)排序,那么你可以使用itertools.groupby
来完成第二部分:
from itertools import groupby
from operator import itemgetter
[[g[-1] for g in group] for id_, group in groupby(outerlist, key=itemgetter(0))]
演示:
>>> outerlist = [
... [100,'XHS',0],
... [100,'34B',3],
... [100,'42F',1],
... [101,'XHS',2],
... [101,'34B',5],
... [101,'42F',2],
... [102,'XHS',1],
... [102,'34B',2],
... [102,'42F',0],
... [103,'XHS',0],
... [103,'34B',4],
... [103,'42F',2]
... ]
>>> from itertools import groupby
>>> from operator import itemgetter
>>> [[g[-1] for g in group] for id_, group in groupby(outerlist, key=itemgetter(0))]
[[0, 3, 1], [2, 5, 2], [1, 2, 0], [0, 4, 2]]
如果没有排序,您必须先排序(使用outerlist.sort(key=itemgetter)
),或者,如果您不需要其他地方的排序版本,请使用collections.defaultdict
方法分组:
from collections import defaultdict
grouped = defaultdict(list)
for sublist in outerlist:
grouped[sublist[0]].append(sublist[-1])
output = grouped.values()
答案 3 :(得分:1)
如果您不知道每个密钥的项目数和每个密钥的项目是否在原始列表中连续进行,则可以使用groupby
:
>>> from itertools import groupby,izip
>>> from operator import itemgetter
>>> [map(itemgetter(-1),it) for key,it in groupby(L,itemgetter(0))]
[[0, 3, 1], [2, 5, 2], [1, 2, 0], [0, 4, 2]]
每个it
都是具有相同键的项目的迭代器:
>>> [list(it) for key,it in groupby(L,itemgetter(0))]
[[[100, 'XHS', 0], [100, '34B', 3], [100, '42F', 1]], [[101, 'XHS', 2], [101, '34B', 5], [101, '42F', 2]], [[102, 'XHS', 1], [102, '34B', 2], [102, '42F', 0]], [[103, 'XHS', 0], [103, '34B', 4], [103, '42F', 2]]]
map
只取每个子列表中的最后一个元素:
>>> [map(itemgetter(-1),it) for key,it in groupby(L,itemgetter(0))]
[[0, 3, 1], [2, 5, 2], [1, 2, 0], [0, 4, 2]]
答案 4 :(得分:0)
l=[[100,'XHS',0],
[100,'34B',3],
[100,'42F',1],
[100,'XHS',0],
[100,'34B',30],
[100,'42F',10],
[100,'XHS',0],
[100,'34B',300],
[100,'42F',100]]
def chunks(l, n):
for i in xrange(0, len(l), n):
yield l[i:i+n]
将打印:
[[0, 3, 1], [0, 30, 10], [0, 300, 100]]