繁体   English   中英

使用Python中每个列表的最后一个元素

[英]Using the last element from each list in Python

我在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中实现呢? 谢谢

一种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]})
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

您正在尝试在这里做件事:

  • 获取每个嵌套列表的最后一个元素。
  • 将这些元素按每个嵌套列表的第一个元素分组。

您可以使用列表推导来获取每个嵌套列表的最后一个元素:

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()

如果您不知道每个键有多少项,并且每个键的项在原始列表中连续出现,则可以使用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]]
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]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM