这里是单行解决方案:
[l[i] for i in sorted({e[2]: i for i, e in zip(range(len(l) - 1, -1, -1), l[::-1])}.values())]
输出:
[['h', 'i', 'l'],
['m', 'b', 'x']]
这是一个 for 循环解决方案:
uniq_value = set()
final_list = []
for e in l:
if e[2] not in uniq_value:
uniq_value.add(e[2])
final_list.append(e)
final_list
输出:
[['h', 'i', 'l'],
['m', 'b', 'x']]
我一直在对@FilipMłynarski、@Exa 和我的解决方案进行基准测试:
from simple_benchmark import BenchmarkBuilder
from random import choice
from string import ascii_letters
import numpy as np
b = BenchmarkBuilder()
def _filip(x):
stack = [set() for _ in x[0]]
for row in x:
if all(i not in seen for i, seen in zip(row, stack)):
for idx, i in enumerate(row):
stack[idx].add(i)
yield row
@b.add_function()
def filip(l):
return list(_filip(l))
@b.add_function()
def exa(l):
t = []
for sl in l:
for st in t:
for (v, o) in zip(sl, st):
if v == o:
break
else:
continue
break
else:
t.append(sl)
return t
@b.add_function()
def kederrac(l):
uniq_value = set()
final_list = []
for e in l:
if e[2] not in uniq_value:
uniq_value.add(e[2])
final_list.append(e)
return final_list
@b.add_function()
def exa_fix_index(l):
t = []
for sl in l:
for st in t:
if sl[2] == st[2]:
break
else:
continue
break
else:
t.append(sl)
return t
@b.add_function()
def mathfux(array, idx=2):
array = np.array(array)
ith_column = array[:, idx]
u, good_indices = np.unique(ith_column, return_index=True)
new_array = array[good_indices]
new_array = new_array.tolist() #if you need to convert back to list
return new_array
@b.add_arguments('Size of list of lists')
def argument_provider():
for exp in range(2, 7):
size = 10**exp
list_of_lists = [[choice(ascii_letters) for _ in range(3)] for _ in range(size)]
yield size, list_of_lists
r = b.run()
r.plot()
输出: