查看列表列表的有效方法?

时间:2016-07-18 18:13:17

标签: python numpy

我不断创建一个基于500列的随机生成的大小为10的New_X列表。

每次创建新列表时,它都必须是唯一的,并且我的函数NewList只有在尚未创建并附加到New_X后才会返回List_Of_Xs

def NewList(Old_List):

end = True
while end == True:

    """ Here is code that generates my new sorted list, it is a combination of elements 
        from Old_List and the other remaining columns,
        but the details aren't necessary for this question. """ 

    end = (List_Of_Xs == np.array([New_X])).all(axis=1).any()

List_Of_Xs.append(New_X)
return New_X

我的问题是,end = (List_Of_Xs == np.array([New_X])).all(axis=1).any()行是查看List_Of_Xs的有效方式吗?

我的List_Of_Xs可以长到超过100,000个列表,所以我不确定这是否效率低。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

所以让我直截了当,因为代码看起来并不完整: 1.您有一个旧列表,每次迭代都会不断增长 你计算一个清单 3.将它与旧列表中的每个列表进行比较,看看是否应该打破循环?

一种选择是将列表存储在一个集合而不是列表列表中。 将元素与列表的所有元素进行比较将是每次迭代的O(n)操作。使用一个集合它应该是O(1)avg ...虽然你可能每次迭代都得到O(n)直到最后一次。

其他想法是计算每个元素的md5并进行比较,以便您不比较完整列表。

答案 1 :(得分:1)

正如我在评论中观察到的那样,数组比较可能非常慢,尤其是当列表变大时。它必须每次都创建数组,这会消耗时间。

这是一个集合实现

创建10个元素列表的功能:

def foo(N=10):
    return np.random.randint(0,10,N).tolist()

生成列表并打印唯一列表的功能

def foo1(m=10):
    Set_of_Xs = set()
    while len(Set_of_Xs)<m:
        NewX = foo(10)
        tx = tuple(NewX)
        if not tx in Set_of_Xs:
            print(NewX)
            Set_of_Xs.add(tx)
    return Set_of_Xs

示例运行。如上所述,它没有显示是否有重复。

In [214]: foo1(5)
[9, 4, 3, 0, 9, 4, 9, 5, 6, 3]
[1, 8, 0, 3, 0, 0, 4, 0, 0, 5]
[6, 7, 2, 0, 6, 9, 0, 7, 0, 8]
[9, 5, 6, 3, 3, 5, 6, 9, 6, 9]
[9, 2, 6, 0, 2, 7, 2, 0, 0, 4]
Out[214]: 
{(1, 8, 0, 3, 0, 0, 4, 0, 0, 5),
 (6, 7, 2, 0, 6, 9, 0, 7, 0, 8),
 (9, 2, 6, 0, 2, 7, 2, 0, 0, 4),
 (9, 4, 3, 0, 9, 4, 9, 5, 6, 3),
 (9, 5, 6, 3, 3, 5, 6, 9, 6, 9)}