从数组列表中删除除具有最高值的项目之外的所有项目

时间:2016-06-13 13:41:18

标签: python arrays

让我们说我有一个数组列表,如:

list= [[(1,2),124,10001],[(1,2),124,10002],[(1,2),124,10003][(1,2),101,10001],...]

如何提取所有数组,在本例中为值124,并按最后一个值对这些数组进行排序,并保持最高值(此处为:10003)。所以我离开了:

list=[[(1,2),124,10003],[(1,2),101,10001],...]

2 个答案:

答案 0 :(得分:0)

不是最狡猾的方式,但它仍然可以解决问题:

l = [[(1,2),124,10001],[(1,2),124,10002],[(1,2),124,10003],[(1,2),101,10001]]

l.sort(key=lambda x: x[2], reverse=True)
l.sort(key=lambda x: x[1])
pr = None
lmax = []

for i in l:
    if i[1] != pr:
        lmax.append(i)
    pr = i[1]

print lmax

答案 1 :(得分:0)

我的尝试,大量免责声明:这是我对你的问题的理解:

  • 列出了3个元素的列表:元组,第一个索引,第二个索引
  • 您想要选择一个第一个索引值(例如124)并将其内爆 - 删除所有第一个索引等于所选值的项目,仅保留第二个索引的最高值。

代码:

l = [[(1,2),124,10001], [(1,2),124,10002], [(1,2),124,10003], [(1,2),101,10001]]

def implode_max(my_key, my_list):
    yield max(filter(lambda x: x[1] == my_key, my_list), key=lambda x: x[2])
    yield next(filter(lambda x: x[1] != my_key, my_list))
    # yield next(iter(filter(lambda x: x[1] != my_key, my_list)))  # python 2
    # or
    # for el in filter(lambda x: x[1] != my_key, my_list):
    #     yield el

# this function is a generator, so to print it we need to materialize it
# but for your needs maybe iterator is better
print(list(implode_max(124, l)))

这应该适用于python 2和3,但是在3上它会更快,因为过滤器返回迭代器,所以使用更少的内存。

首先我们过滤以获得我们想要破坏的那些元素,而不是找到我们想要保留的一个元素,然后 - 依据它。

其次,我们对所有其他元素进行过滤,然后我们逐一对其进行过滤。

然而

如果您的问题是要破坏按第一个索引分组的所有元素,我的解决方案将不会那么好:

l = [[(1,2),124,10001], [(1,2),124,10002], [(1,2),124,10003], [(1,2),101,10001], [(1,2),101,9999]]

tmp_dict = {}

for e in l:
    if e[1] not in tmp_dict or tmp_dict[e[1]][2] < e[2]:
        tmp_dict[e[1]] = e

result = tmp_dict.values()

这里我们使用临时字典随机访问由第一个索引索引的元素,在字典中我们只保留具有最高第二个索引的元素。