有一個列表去重的題目是這樣的:有一個列表有N個元素,將其去重並保持元素順序不變;
有幾種解答方法:
#列表排重且不改變順序 def unique(items): seen = set() rs = [] for i in items: if i not in seen: rs.append(i) seen.add(i) return rs def unique1(items): seen =set() return [x for x in items if not (x in seen or seen.add(x))] def unique2(items): seen = set() for i in items: if i not in seen: yield i seen.add(i) def unique3(items): return list(dict.fromkeys(items)) #Python 字典 fromkeys() 函數用於創建一個新字典,以序列items中元素做字典的鍵,value(可選)為字典所有鍵對應的初始值。 #python3.6之后記錄插入鍵值對的順序;
其中unique1方法中使用了列表表達式,如何理解這個列表表達式呢?
關鍵是要理解or的用法:
or是先判斷第一個條件的真假,只有在第一個條件為假的情況下才會對第二個進行判斷。整個return [x for x in items if not (x in seen or seen.add(x))]的作用其實就是把那些沒有在seen集合中的元素放到集合seen中,然后返回這些元素;
詳細解釋一下這個return語句就是:
如果x in seen為假,代表seen中沒有這個元素,那就執行第二個語句seen.add(x)把x放入集合seen中,第二個語句成功返回None,那么false or None的結果還是None,而if not (x in seen or seen.add(x))就是真,那么就會把x提取出來放到列表中;
如果x in seen為真(列表中有這個元素),直接就返回true,or后面的第二個語句就不會執行了,if not (x in seen or seen.add(x))就為假,x就不會被放到列表中;