2016-06-13 126 views
1
列表

比方说,我有这样的阵列的列表:删除除了具有最高值的项目的所有项目从阵列

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],...] 
+1

为什么在结果中有[[(1,2),101,10001]? 101不是最高也不是10001. –

+0

因为我想用124保持最高的阵列,其余的应该不受影响。 – user3759978

+1

你的python无效。这是一个列表清单吗?顺便说一句。不鼓励使用'l'作为变量名。无论如何,你能不能通过每个嵌套列表中的第三个元素对列表进行排序,并选择第一个或最后一个?例如。 (1,2),124,10003],[(1,2),124,10002]的排序(l,key = lambda x:x [2],reverse = True) (1,2),124,10001],[(1,2),101,10001]]' – jDo

回答

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

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

+0

这正是我的意思:)“下一个收益”部分是做什么的? – user3759978

+0

@ user3759978第一个yield是正常工作的“返回这个元素”,第二个是从发生器中逐个采用元素(使用'next'),如果不存在'next',它将返回一个完整的过滤数组python 2或python 3中的“filter object”([some docs](https://wiki.python.org/moin/Generators))(如果这是你想要的东西,请将它标记为答案:)) – Jerzyk

+0

这是一些真棒的东西。谢谢! – user3759978

0

不是最Python的方式,但它仍然是卓有成效的:

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 
+2

pythonic与否,有时你需要从某处开始! '(not i [1] == pr)<==>(i [1]!= pr)' – Jerzyk

+0

@Jerzyk你能解释一下这个区别吗? 'not'的优先级低于==,所以'not a == b'等于'!(a == b)',等于'a!= b'。显然我错过了什么? –

+1

你正在做两个操作,首先比较,然后否定,当你可以用一个操作替换 - 比较不等于 - 不仅它使你的代码更快,但它更容易阅读 – Jerzyk