我是Python的新手,并尝试了不同的方法来优化和简化我的代码。
我有一个最初为空的数组列表(必须采用这种格式),我需要使用数组进行更新,确保不会添加重复的条目。
现在我正在按照以下方式进行,这是我尝试过的唯一有效的方法:
if len(where(((array(self.pop_next)-(self.pop[self.top_indv_indx[i]]))==0).sum(1)==len((self.pop[self.top_indv_indx[i]])))[0])<=0):
self.pop_next.append(self.pop[self.top_indv_indx[i]])
其中self.pop_next
是我的数组列表,self.pop[self.top_indv_indx[i]]
是要添加的数组。
我知道这个Unpythonic并且猜测有更好的简单方法来做同样的事情。 请帮忙
答案 0 :(得分:1)
编辑:我从您的评论中看到您正在使用numpy数组。我从来没有使用numpy所以我不知道他们如何使用套装。
一种选择是使用set
。 Sets are like lists但它们是无序的,只允许每个项目添加一次:
>>> s = set()
>>> s.add(1)
>>> s.add(2)
>>> s.add(2)
>>> s.add(2)
>>> s
set([1, 2])
但是,如果您尝试将list
添加到集合中,则会遇到问题:
>>> s.add(['my','list'])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
要添加到set
的项must be hashable,list
无法清除,因为它不能具有不变的哈希值,因为它可以随时修改添加或删除值。
如果你不需要你要检查的列表是可变的,你可以将它们转换为固定且易于安装并且设置友好的元组:
>>> mylist = ['my','list']
>>> s = set()
>>> s.add(tuple(mylist))
>>> s.add(tuple(mylist))
>>> s
set([('my', 'list')])
答案 1 :(得分:0)
您可能希望尝试使用numpy.all(array1 == array2)
作为单个数组比较的条件。
编辑扩展程序:
要遍历列表,您可以使用以下内容:
if all((numpy.all(array_to_add != a) for a in array_list)):
array_list.append(array_to_add)
这会将array_to_add
与array_list
的所有元素进行比较。请注意,all
此处为__builtin__.all
,与numpy.all
形成鲜明对比。如果您之前执行过from numpy import *
,则无效。请改用import numpy
,并按照上面的示例中的全名调用函数。
如果可以按对象进行比较(例如,如果内存中的两个数组完全相同,则两个数组相同),请使用以下更简单的变体:
if array_to_add is not in array_list:
array_list.append(array_to_add)