Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用每个列表中的最后一个元素_Python - Fatal编程技术网

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

在Python中使用每个列表中的最后一个元素,python,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列表中的最后一个元素(第一个元素)创建一个列表。。 因此,对于上面的示例列表,我的

我有一个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中实现这一点?谢谢

您在这里尝试做两件事:

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.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()
您在这里尝试做两件事:

  • 获取每个嵌套列表的最后一个元素
  • 按每个嵌套列表的第一个元素对这些元素进行分组
您可以使用列表理解来获取每个嵌套列表的最后一个元素:

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

一个分解了构建块的itertools方法-获取最后一个元素,分组为三,将三人一组转换为一个列表

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]})
从集合导入defaultdict
dd=默认DICT(列表)
对于a中的el:
dd[el[0]]。追加(el[-1])
#defaultdict(,{100:[0,3,1],101:[2,5,2],102:[1,2,0],103:[0,4,2]})

分解构建块的itertools方法-获取最后一个元素,分组为三,将三人一组转换为一个列表

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]})
从集合导入defaultdict
dd=默认DICT(列表)
对于a中的el:
dd[el[0]]。追加(el[-1])
#defaultdict(,{100:[0,3,1],101:[2,5,2],102:[1,2,0],103:[0,4,2]})
将打印:

[[0, 3, 1], [0, 30, 10], [0, 300, 100]]
将打印:

[[0, 3, 1], [0, 30, 10], [0, 300, 100]]

如果不知道每个键有多少项,并且每个键的项在原始列表中连续出现,则可以使用:

解释 每个
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]]

如果不知道每个键有多少项,并且每个键的项在原始列表中连续出现,则可以使用:

解释 每个
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]]


你怎么知道每个子列表的大小应该是3?FYI,列表不是有效的Python——中间的项目应该被引用。每个子列表只包含3个元素。ID,代码,以及每个ID的代码的出现。我想对每个ID计算每个代码,并创建n个计数向量,其中n是唯一ID的数目。(如100101等)每个子列表的第二个项目必须是一个字符串,因为它包含字母数字,否则Python就会产生一个错误。@ TigGrand可能是有效的Python。你怎么知道XHS不是一个名字?你怎么知道每个子列表的大小应该是3?FYI,列表不是有效的Python——中间的项目应该是Quo.Sales每个子元素只包含3个元素。…ID,一个代码,以及每个ID的代码出现次数…我想计算每个ID的每个代码的计数,并创建n个计数向量,其中n是唯一ID的数量(例如100101等)每个子列表的第二项必须是字符串,因为它包含字母数字,否则python会抛出错误。@thegrinner它可能是有效的python。你怎么知道XHS不是一个名称?这没有得到他的答案。看看他所需的输出,我们开始吧。这样更好。|=^)…这很奇怪。我在你编辑之前否决了这个,但是我不想删除否决票。它认为我在你回答后否决了它。去梅塔!为了删除我的否决票,我不得不做一个修改。@kojiro:在5分钟的宽限期内进行的编辑不会重置投票锁。这没有得到他的答案。看看他要求的输出,我们开始吧。那更好。|=^)…这很奇怪。我在你编辑之前否决了这个,但是我不想删除否决票。它认为我在你回答后否决了它。去梅塔!为了删除我的否决票,我不得不做一些修改。@kojiro:在5分钟的宽限期内进行的编辑不会重置投票锁。我喜欢这个答案,但这是最有效的方法吗?这绝对是一种非常简洁的方法。@MohammadS:它比使用
zip(*outerlist)[0]
更有效,因为它不会为丢弃的列构建新的元组。令人惊讶的是,有这么多人想要重新回答这个问题。我喜欢这个答案,但这是最有效的方法吗?这绝对是一种非常简洁的方法。@MohammadS:它比使用
zip(*outerlist)[0]
更有效,因为它不会为被丢弃的列构建新的元组。令人惊讶的是,有这么多人想要重新回答这个问题。我完全错过了小组。@MartijnPieters OP偷偷地将它作为一个注释。。。(好吧,只是在问题中加强了对它的微妙描述)我完全错过了小组。@MartijnPieters OP偷偷把它作为一个评论。。。(好吧,我刚加固了潜艇