从列表中过滤记录

时间:2019-04-18 10:29:48

标签: python list

我是python的新手,希望获得一些帮助,如果有人可以提供帮助,将不胜感激,

我在列表下面有一个python列表,我想形成一个新列表,其中将包含基于子列表的第一个元素的最后一个子列表,例如。 ISIN = BE0974302342,我只想将['BE0974302342',21,19,0,2,0]添加到新列表中,并忽略所有第一次出现的情况,我想到了使用for循环将每个子列表的第一个元素与第一个元素进行比较第二个子列表,但这不是一个干净的方法,可以使用列表理解或某些内置方法来实现吗?

my_list = [['BE0974302342', 21, 0, 0, 0, 0], 
           ['BE0974302342', 21, 19, 0, 0, 0], 
           ['BE0974302342', 21, 19, 0, 2, 0], 
           ['FR0000073843', 22, 19, 0, 2, 0], 
           ['FR0000073843', 22, 20, 0, 2, 0], 
           ['FR0000073843', 22, 20, 0, 2, 0], 
           ['FR0000076861', 21, 20, 0, 2, 0], 
           ['FR0000076861', 21, 18, 0, 2, 0], 
           ['FR0000076861', 21, 18, 3, 2, 0], 
           ['FR0000076861', 21, 18, 3, 3, 0]]

 new_list = [['BE0974302342', 21, 19, 0, 2, 0], 
             ['FR0000073843', 22, 20, 0, 2, 0], 
             ['FR0000076861', 21, 18, 3, 3, 0]]

4 个答案:

答案 0 :(得分:4)

您可以使用itertools.groupby按第一个元素对子列表进行分组,并保留每个组的最后一个子列表:

from itertools import groupby
from operator import itemgetter

[list(v)[-1] for _,v in groupby(my_list, key=itemgetter(0))]

输出

[['BE0974302342', 21, 19, 0, 2, 0],
 ['FR0000073843', 22, 20, 0, 2, 0],
 ['FR0000076861', 21, 18, 3, 3, 0]]

答案 1 :(得分:3)

my_list = [['BE0974302342', 21, 0, 0, 0, 0], 
           ['BE0974302342', 21, 19, 0, 0, 0], 
           ['BE0974302342', 21, 19, 0, 2, 0], 
           ['FR0000073843', 22, 19, 0, 2, 0], 
           ['FR0000073843', 22, 20, 0, 2, 0], 
           ['FR0000073843', 22, 20, 0, 2, 0], 
           ['FR0000076861', 21, 20, 0, 2, 0], 
           ['FR0000076861', 21, 18, 0, 2, 0], 
           ['FR0000076861', 21, 18, 3, 2, 0], 
           ['FR0000076861', 21, 18, 3, 3, 0]]

my_list_dict = {}
new_list = []

# Unique Items with id as key and rest as values
for item in my_list:
    my_list_dict[item[0]] = item[1:]

# Convert them back to a list
for k,v in my_list_dict.items():
    new_list.append([k,*v])

print(new_list)

答案 2 :(得分:2)

这是另一种方法,不需要itertools

tmp = { x[0]:x for x in my_list }
new_list = list(tmp.values())

tmp字典包含子列表中第一个元素的最后出现。唯一要注意的是,子列表将以与原始输入不同的顺序出现:

new_list
=> [['FR0000073843', 22, 20, 0, 2, 0],
    ['FR0000076861', 21, 18, 3, 3, 0],
    ['BE0974302342', 21, 19, 0, 2, 0]]

答案 3 :(得分:2)

单线(不使用任何导入):

print(list({(x[0]): x for x in my_list}.values()))

输出

[['BE0974302342', 21, 19, 0, 2, 0], ['FR0000073843', 22, 20, 0, 2, 0], 
 ['FR0000076861', 21, 18, 3, 3, 0]]

详细说明

这个想法是将嵌套列表的每个第一元素与列表本身映射为key-val对,因为dict不能有重复的键,它将为我们处理它:

print({x[0]: x for x in my_list})  

将返回类似的内容:

{'BE0974302342': ['BE0974302342', 21, 19, 0, 2, 0], 'FR0000073843': ['FR0000073843', 22, 20, 0, 2, 0], 'FR0000076861': ['FR0000076861', 21, 18, 3, 3, 0]}

现在,我们已经具有一对唯一的key-val列表对,从dict获取值将为我们提供唯一的嵌套列表:

print({x[0]: x for x in my_list}.values())

哪个会给我们dict中的list

dict_values([['BE0974302342', 21, 19, 0, 2, 0], ['FR0000073843', 22, 20, 0, 2, 0], ['FR0000076861', 21, 18, 3, 3, 0]])

我们现在可以将其转换为列表:

print(list({(x[0]): x for x in my_list}.values()))

这将根据其中的第一个元素为我们提供所需的唯一列表:

[['BE0974302342', 21, 19, 0, 2, 0], ['FR0000073843', 22, 20, 0, 2, 0], 
 ['FR0000076861', 21, 18, 3, 3, 0]]