• 背景: 一个有2百多万行测试文件，按行统计得出不重复行内容及各自数量. 集合 lineset = set() 再读取每一行后 linetmp = f.readline()，使用2个方法处理。...方法1：直接 lineset.add(linetmp
背景:

一个有2百多万行的测试文件，按行统计得出不重复行内容及各自的数量. 集合 lineset = set()
再读取每一行后 linetmp = f.readline()，使用4个方法处理。见下面的代码
win10, anaconda 4.8.3, python 3.8.3

结果

test_add_if() 用的时间最短。
也就是, 不了解效率的情况下，使用一般的判断流程图，即可得到最佳效率的小程序。(对很多数据来说。数据少了，也没人在乎效率了)

#
#  comparing time difference between set().add(newitem) and
#  if newitem not in list, then add to set().add(newitem)
#  conclusion: test_add_if() is the best way for 2M+ lines check.
#

test_set = set()
test_file = "test_set_if.dxf"

def set_add_directly():
global test_set
with open(test_file, 'r') as f:
line_tmp = f.readline()
while line_tmp:
test_set.add(line_tmp)
line_tmp = f.readline()

def set_add_if():
global test_set
with open(test_file,'r') as f:
line_tmp = f.readline()
while line_tmp:
if line_tmp not in test_set:
test_set.add(line_tmp)
line_tmp = f.readline()

def set_line_split():
global test_set
with open(test_file, 'r') as f:
lines = f.readlines()
linelist = [line.split for line in lines]
test_set = set(linelist)
#  print('set function:', test_set, flush=True)

def set_f(): # there is \n for each element. more time is needed.
global test_set
with open(test_file,'r') as f:
test_set = set (f.readlines())

# main
if __name__ == '__main__':
from timeit import Timer
timer1 = Timer('set_add_directly()', 'from __main__ import set_add_directly')
t1 = timer1.timeit(1) # one round is more than 1s. so it is timeit(1) not 10000.
timer2 = Timer('set_add_if()', 'from __main__ import set_add_if')
t2 = timer2.timeit(1)
timer3 = Timer('set_line_split()', 'from __main__ import set_line_split')
t3 = timer3.timeit(1)
timer4 = Timer('set_f()', 'from __main__ import set_f')
t4 = timer4.timeit(1)
print('set_add_directly - set_add_if:', t1-t2, flush=True)
print('set_add_directly - set_line_split:', t1-t3, flush=True)
print('set_line_split - set_add_if:', t3-t2, flush=True)
print('set_f - set_add_if:', t4-t2, flush=True)


其中一次的结果:
---------- Python ----------
set_add_directly - set_add_if: 0.06032050000000011
set_add_directly - set_line_split: -0.24342030000000003
set_line_split - set_add_if: 0.30374080000000014
set_f - set_add_if: 0.10101979999999977

Output completed (3 sec consumed) - Normal Termination


展开全文
• >>> s = set('abc') >>> s {'c', 'b', 'a'} >>> s.add('de') >>> s {'c', 'b', 'de', 'a'} >>> s.update('fg') ...如上面代码所示，add将括号内字符作为一个整体加入集合中，而uptate将括号内字
>>> s = set('abc')
>>> s
{'c', 'b', 'a'}
>>> s.add('de')
>>> s
{'c', 'b', 'de', 'a'}
>>> s.update('fg')
>>> s
{'g', 'de', 'a', 'c', 'b', 'f'}
>>>
如上面代码所示，add将括号内字符作为一个整体加入集合中，而uptate将括号内字符拆成单个对象加入集合中

展开全文
• 我在一段代码中，调用ArrayList的add（）方法集合中添加一个对象book，确定book对象在添加前的那一刻不为空，集合也是空的，但是会发生空指针异常，这是为什么？
• 关于这个Set方法的妙用，主要在于Set集合的add方法。 我们知道Set集合是可以去重的，就是没有相同的元素。在执行add方法时候，如果这个元素已经在set中存在，那么就返回false，否则返回true。 所以，我们可以根据...
关于这个Set方法的妙用，主要在于Set集合的add方法。
我们知道Set集合是可以去重的，就是没有相同的元素。在执行add方法时候，如果这个元素已经在set中存在，那么就返回false，否则返回true。
所以，我们可以根据返回值，来确定当前添加的元素是否已经在set中存在。
这个是在leetcode做一道数独问题时候，碰到的，感觉很不错。
原题：https://leetcode.com/problems/valid-sudoku/description/
这个问题，是判断一个9*9的格子，是不是有效的数独。
解决方法如下
class Solution {
public boolean isValidSudoku(char[][] board) {
for(int i = 0; i<9; i++){
HashSet<Character> rows = new HashSet<Character>();
HashSet<Character> columns = new HashSet<Character>();
HashSet<Character> cube = new HashSet<Character>();
for (int j = 0; j < 9;j++){
if(board[i][j]!='.' && !rows.add(board[i][j]))
return false;
if(board[j][i]!='.' && !columns.add(board[j][i]))
return false;
int RowIndex = 3*(i/3);
int ColIndex = 3*(i%3);
if(board[RowIndex + j/3][ColIndex + j%3]!='.' && !cube.add(board[RowIndex + j/3][ColIndex + j%3]))
return false;
}
}
return true;
}
}

展开全文
• List集合的add()方法是添加单独的元素进行存储，而addAll()方法是将指定的collection集合所有的元素添加到当前List集合中。 **注意：**当前List集合追加的元素的个数即为指定colection集合中元素的大小。 ...
List集合中add()方法和addAll()方法的区别
简单来说

List集合中的add()方法是添加单独的元素进行存储，而addAll()方法是将指定的collection集合所有的元素添加到当前List集合中。
**注意：**当前List集合追加的元素的个数即为指定colection集合中元素的大小。


展开全文
• 比如ArrayList，其Add（继承自接口IList）和AddRange方法可用于想集合中添加元素。 代码示例： （1）Add：添加单个元素 ArrayList myAL = new ArrayList(); myAL.Add( “The” ); myAL.Add( “quick” ); myAL.Add( ...
• 分别在fro循环内外new一个对象，然后在循环中将对象加入集合中，两种方法产生结果不同。 在for循环内new一个对象，并添加进list中，与添加数值结果没有差别。 在for循环外new一个对象，并添加进list中，无论...
• //这里调用是对象hashCode()方法 // This function ensures that hashCodes that differ only by // constant multiples at each bit position have a bounded // number of collisions (approximately 8 ...
• //这里调用是对象hashCode()方法 // This function ensures that hashCodes that differ only by // constant multiples at each bit position have a bounded // number of collisions (approximately 8 ...
• 在C#的List集合操作中，有时候需要将符合条件的对象添加到已有List集合中的末尾，此时就需要使用到List集合的Add方法，Add方法的作用为将对应的元素添加到List集合末尾，Add方法签名为void Add(T item)，T代表List...
• 1、T是引用类型时，在循环外边已经new了一个对象，相当于这个对象地址在内存空间已经开辟出来了，保存到了固定位置，这时候我们使用add方法时，会增加值个数，但引用地址不变，所以后面值会覆盖掉前面值。...
• TreeSet集合的add()方法的源码 --------------------------------------- interface Collection { ... } interface Set extends Collection { ... } --------------------------------------- class ...
• //集合的方法:add与addAll,clear等方法 import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; public class CollectionDemo { public static void main(String[] args) {...
• 说起LinkedList我们先说说他底层实现，...在说add方法之前我们先看一个Node结点类(内部类)，以免后面不知道Node是什么： private static class Node<E> { //存储当前结点数据 E item; //记录下一
• 两个方法都可以向集合中添加元素，可在使用上有差别。 ①从可添加元素来说：add()只可以添加不可变元素，如数字，字符串，元组，否则报错；而update()可以添加字符串、列表、元组、字典等可迭代元素，若添加...
• List集合add方法覆盖原来内容问题：今天写了一波逻辑，觉得没问题，list.add(xx)时候，xx我debug时候看着数据没问题，但是list.add进去之后发现数据全部都一样解决: 问题：今天写了一波逻辑，觉得没问题，list...
• HashSet中的add方法 源代码如下： public boolean add(E e) { return map.put(e, PRESENT)==null; } 由源代码（HashSet类中add方法）可以看出PRESENT是常量类型（由fina修饰，全部大写），map是HashMap类型的：...
• add方法用于向集合列表中添加对象。 语法1 用于在列表尾部插入指定元素。如果List集合对象由于调用add方法而发生更改，则返回true；否则返回false。add(Ee)e：要添加到列表中元素。 实例 public static void ...
• （1）、使用add（）方法向set集合中添加对象 1）、如果Set集合中已经给定包含相同对象时，则不改变原来Set集合。 语法 boolean add(E e)  返回值：如果Set集合中不包含要添加对象，则添加对象并返回...
• 一、HashMap类中hash(Object key)方法分析 由于在上一篇博客中已详细分析过该方法，此处不再赘述。...二、详述HashSet集合add()方法存储自定义类型对象执行过程 下面是自定义类代码： public ...
• public synchronized boolean add(E e) { modCount++; //elementCount + 1表示当前数组最后一个元素位置下一个位置 ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; return ...
• 我们经常会遍历 list集合,在遍历过程中,如果在遍历过程中添加了 add() 或者 addAll() 方法修改了遍历list列表,那么会报错. 代码演示: List<Integer> list = new ArrayList<Integer>(); ...

...