比较列表中的元素并删除

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比较列表中的元素并删除相关的知识,希望对你有一定的参考价值。

l=[['a', 'random_str', 4], ['b', 'random_str2', 5], ['b', 'random_str3', 7]]

因此,我有一个这样的列表,我想遍历此列表以检查每个子列表的零索引是否彼此相等,因此请检查每个子列表的零索引是否等于另一个,然后检查两个或更多类似的对象检查子列表中的第二个索引,并仅使子列表的int值最低,然后删除所有其他索引。

所以输出应该是

[['a', 'random_str', 4], ['b', 'random_str2', 5]]

因此它将删除第二个索引中具有较高int的子列表

我在想这样的事情

for i in l:
    for k in i:
        if k[0]=i[0][0]:
            # then I dont know 
答案

可以通过pandassort_valuesgroupby来实现:

import pandas as pd
l=[['a', 'random_str', 4], ['b', 'random_str2', 5], ['b', 'random_str3', 7]]

#create dataframe from list of list
df = pd.DataFrame(l)

#sort column based on third column / index = 2
df = df.sort_values(by=2)

#groupby first column and only take first entry which is lowest int after sort.
df = df.groupby(0).head(1)

#put back to list of list
df = df.values.tolist()

print(df)

打印输出

[['a', 'random_str', 4], ['b', 'random_str2', 5]]
另一答案

此列表理解相当可怕,但您要做的是-为每个具有第一个元素的子列表迭代第一个元素的子列表,根据第三个元素找到最小元素。

>>> [min((x for x in l if x[0] == y), key=lambda x: x[2]) for y in set(z[0] for z in l)]
[['b', 'random_str2', 5], ['a', 'random_str', 4]]
另一答案

按第一个元素分组,并且在每个组中按三分之一查找最小:

f2 = lambda x: x[2]
f0 = lambda x: x[0]
[min(subl, key=f2) for _, subl in itertools.groupby(sorted(l, key=f0), key=f0)]
# => [['a', 'random_str', 4], ['b', 'random_str2', 5]]
另一答案
l=[['a', 'random_str', 4], ['b', 'random_str2', 5], ['b', 'random_str3', 7]]
res = {}
for sublist in l:
    if sublist[0] not in res.keys():
        res.update({sublist[0]:[sublist[1], sublist[2]]})
    else:
        if sublist[2]<res[sublist[0]][1]:
            res[sublist[0]][1] = sublist[2]

final_res = [[index, res[index][0], res[index][1]] for index, value in res.items()]
print(final_res)

输出

[['a', 'random_str', 4], ['b', 'random_str2', 5]]
另一答案

这应该可以解决问题。 (我敢肯定,您可以使用一种不会排序的聪明算法来减少时间复杂度,但是除非我们在这里谈论瓶颈,否则您不要太在意这个。)

>>> from itertools import groupby                                                          
>>> from operator import itemgetter                                                        
>>>                                                                                        
>>> first, second = itemgetter(0), itemgetter(2)                                           
>>> l = [['a', 'random_str', 4], ['b', 'random_str2', 5], ['b', 'random_str3', 7]]         
>>> groups = groupby(sorted(l), key=first)                                                 
>>> [min(list(lists), key=second) for _, lists in groups]                                  
[['a', 'random_str', 4], ['b', 'random_str2', 5]]

想法是按每个子列表中的第一个元素对数据进行分组。为此,需要对groupby进行排序。然后,我们针对元素2提取每个组的最小值。

以上是关于比较列表中的元素并删除的主要内容,如果未能解决你的问题,请参考以下文章

比较两个迭代器并检查哪些元素被添加,删除或两者之间相同

用另一个列表替换主活动中的列表并从视图中删除旧列表

twoday

第二章第三题

如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?

从另一个片段中的目录更新片段中的列表视图元素