我正在寻找更新列表的最有效方法。
我有一个变量self.myGlobalList = []
我还有一个递归函数,每次调用都会生成一个带有坐标的新列表。
在第一次迭代中说,我获得以下列表:
[(1,1), (21,22), (84,6)]
由于self.myGlobalList
不包含任何这些坐标,因此我将其附加到该坐标:
for elem in generatedList:
if elem not in self.myGlobalList:
self.myGlobalList.append(elem);
然后,在第二次迭代中,我获得一个新生成的列表:
[(1,1), (21,22), (9,18), (71, 89), (13, 21)]
现在,我的代码将再次遍历新生成的列表的每个元素,并检查self.myGlobalList
中是否缺少任何元素,如果是,请附加它们。结果应包含新元素:
[(1,1), (21,22), (84,6), (9,18), (71, 89), (13, 21)]
到目前为止,一切正常。
但是,我的列表可以包含500,000多个坐标。在效率方面,这种方法是否足够,您是否可以提出一些建议以对其进行优化?
答案 0 :(得分:0)
例如,您可以执行以下操作(玩具示例):
iterations = [
[(1, 1), (21, 22), (84, 6)], [(1, 1), (21, 22), (9, 18), (71, 89), (13, 21)]]
global_set = set()
global_list = []
for iteration in iterations:
for pair in iteration:
if pair not in global_set:
global_list.append(pair)
global_set.add(pair)
print(global_list)
输出
[(1, 1), (21, 22), (84, 6), (9, 18), (71, 89), (13, 21)]
说明
表达式if pair not in global_set
为O(1)
(即检查元素是否存在需要花费固定的时间),另一方面,if pair not in global_list
将花费O(n)
进行检查如果存在元素。
进一步
答案 1 :(得分:0)
将每个public class Event
{
private DateTime _startDate;
private DateTime _endDate;
private Color _dateColor;
}
放入集合中,然后继续在集合上执行public class Event
{
public EventDates EventDates { get; private set; }
}
public class EventDates
{
private DateTime _startDate;
private DateTime _endDate;
private Color _dateColor;
}
。重复的代码应该进入循环。
generated_list
输出:
union