让我们说我有一个数组列表,如:
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],...]
答案 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)
我的尝试,大量免责声明:这是我对你的问题的理解:
代码:
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()
这里我们使用临时字典随机访问由第一个索引索引的元素,在字典中我们只保留具有最高第二个索引的元素。