比较列表中的元素并删除
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
答案
可以通过pandas
,sort_values
和groupby
来实现:
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提取每个组的最小值。
以上是关于比较列表中的元素并删除的主要内容,如果未能解决你的问题,请参考以下文章