首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Python中每个列表中的最后一个元素

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

Stack Overflow用户
提问于 2013-08-02 13:23:25
回答 4查看 276关注 0票数 1

我在Python中有以下列表:

代码语言:javascript
运行
复制
[[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的最后一个元素(第一个元素)创建一个新的列表列表。因此,对于上面的样本列表,我的结果是:

代码语言:javascript
运行
复制
[[0,3,1],
[2,5,2],
[1,2,0],
[0,4,2]]

我如何在Python中实现这一点?谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-02 13:29:49

一种迭代工具方法,其构建块被分解--获取最后的元素,分组为3,将3组转换为列表.

代码语言:javascript
运行
复制
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]]

但是,您似乎希望对第一个元素(而不是由三个连续项组成的纯块)进行“分组”,因此可以为此使用defaultdict

代码语言:javascript
运行
复制
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]})
票数 8
EN

Stack Overflow用户

发布于 2013-08-02 13:27:42

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2013-08-02 13:29:29

你在这里试图做两件事:

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

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

代码语言:javascript
运行
复制
last_elems = [sublist[-1] for sublist in outerlist]

如果整个列表按照第一个元素( id)排序,那么可以使用itertools.groupby执行第二部分:

代码语言:javascript
运行
复制
from itertools import groupby
from operator import itemgetter

[[g[-1] for g in group] for id_, group in groupby(outerlist, key=itemgetter(0))]

演示:

代码语言:javascript
运行
复制
>>> 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方法进行分组:

代码语言:javascript
运行
复制
from collections import defaultdict

grouped = defaultdict(list)
for sublist in outerlist:
    grouped[sublist[0]].append(sublist[-1])

output = grouped.values()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18017995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档