提问人:Ravi 提问时间:5/14/2022 更新时间:5/14/2022 访问量:84
以有效的方式在另一个列表中查找唯一列表
find unique lists inside another list in an efficient way
问:
solution = [[1,0,0],[0,1,0], [1,0,0], [1,0,0]]
我有上面的嵌套列表,其中包含一些其他列表,我们需要如何在解决方案中获取唯一列表
output = [[1,0,0],[0,1,0]
注意:每个列表的大小相同
我尝试过的事情:
- 获取每个列表并与所有其他列表进行比较,看看它是否重复?但它非常慢..
在插入插入列表之前如何检查,是否有任何重复以避免插入重复
答:
0赞
mpx
5/14/2022
#1
熊猫可能会有所帮助。duplicate
import pandas as pd
df=pd.DataFrame([[1,0,0],[0,1,0], [1,0,0], [1,0,0]])
d =df[~df.duplicated()].values.tolist()
输出
[[1, 0, 0], [0, 1, 0]]
或者,由于您标记了 ,因此可以使用 numpy 方法。multidimensional-array
import numpy as np
def unique_rows(a):
a = np.ascontiguousarray(a)
unique_a = np.unique(a.view([('', a.dtype)]*a.shape[1]))
return unique_a.view(a.dtype).reshape((unique_a.shape[0], a.shape[1]))
arr=np.array([[1,0,0],[0,1,0], [1,0,0], [1,0,0]])
output=unique_rows(arr).tolist()
根据本OP中的建议
0赞
Adam Smith
5/14/2022
#2
由于列表是可变对象,因此无法非常快速地检查身份。但是,您可以转换为元组,并将每个列表的元组化视图存储在一个集合中。
元组是异构的不可变容器,不像列表是可变的和惯用的同质的。
from typing import List, Any
def de_dupe(lst: List[List[Any]]) -> List[List[Any]]:
seen = set()
output = []
for element in lst:
tup = tuple(element)
if tup in seen:
continue # we've already added this one
seen.add(tup)
output.append(element)
return output
solution = [[1,0,0],[0,1,0], [1,0,0], [1,0,0]]
assert de_dupe(solution) == [[1, 0, 0], [0, 1, 0]]
1赞
j1-lee
5/14/2022
#3
如果你不在乎订单,你可以使用:set
solution = [[1,0,0],[0,1,0],[1,0,0],[1,0,0]]
output = set(map(tuple, solution))
print(output) # {(1, 0, 0), (0, 1, 0)}
评论
0赞
mpx
5/14/2022
这真的很紧凑
-1赞
Raphael
5/14/2022
#4
虽然列表不可散列,因此复制效率低下,但元组是。因此,一种方法是将列表转换为元组并复制这些元组。
>>> solution_tuples = [(1,0,0), (0,1,0), (1,0,0), (1,0,0)]
>>> set(solution_tuples)
{(1, 0, 0), (0, 1, 0)}
0赞
Jessica
5/14/2022
#5
试试这个解决方案:
x=[[1,0,0],[0,1,0],[1,0,0],[1,0,0]]
导入 numpy 并将嵌套列表转换为 numpy 数组
导入 numpy 作为 np
a1=np.array(x)
在各行中查找唯一值
a2 = np.unique(a1,轴=0)
将其转换回嵌套列表
a2.tolist()
希望这会有所帮助
评论