❶ C#中 list<object> 去除重復的數據 求最簡單的方法!!
//導入linq命名空間, 然後distinct一下就可以了. 關鍵代碼如下:
using System.Linq;
//比如,list實例為list
var obj = list.Distinct();
//或者麻煩點要根據list的欄位內xxx過濾容就是
var obj_1=from p in list select p.xxx distinct();
(1)list根據條件過濾數據擴展閱讀
list()函數與array()類似,只是它可以在一次操作中從一個數組內提取多個值,同時為多個變數賦值。其形式如下:
voidlist(mixed…)從資料庫或文件中提取信息時,這種構造尤其有用。例如,假如你希望格式化並輸出從一個文本,文件中讀取信息。文件的每一行都包含用戶信息,如姓名、職業和喜愛的顏色,每一項用豎線分隔。典型的一行如下所示:
Nino Sanzi|profesional golfer|green
可以通過一個簡單的循環使用list()來讀取每一行,將各部分數據賦給變數,按照需要格式化並輸出數據。
❷ 【Python知識共建】Python 列表推導式
Python 列表推導式是什麼列表推導式是 Python 語言特有的一種語法結構,也可以看成是 Python 中一種獨特的數據處理方式, 它在 Python 中用於 轉換 和 過濾 數據。
其語法格式如下所示,其中 [if 條件表達式] 可省略。
[表達式 for 迭代變數 in 可迭代對象 [if 條件表達式]]注意:學習列表推導式的前提是掌握 Python for 循環。
列表推導式中存在兩個名詞,一個是 列表,另一個是 推導式 ,列表我們很清楚,就是 Python 的一種數據類型, 而推導式只是一個普通的語法定義詞,有的教程里,會將其叫做 解析式,二者是一樣的概念。
列表推導式會返回一個列表,因此它適用於所有需要列表的場景。
怎麼用基礎使用列表推導式最常見的場景就是優化簡單循環。 for 循環寫法
my_list = [1,2,3]new_list = []for i in my_list:new_list.append(i*2)print(new_list)列表推導式寫法
nn_list = [i*2 for i in my_list]print(nn_list)是不是對比看就是將 for 循環語句做了變形之後,增加了一個 [],不過需要注意的是,列表推導式最終會將得到的各個結果組成一個新的列表。 再看一下列表推導式語法構成 nn_list = [i*2 for i in my_list] ,for 關鍵字後面就是一個普通的循環,前面的表達式 i*2 其中的 i 就是 for 循環中的變數,也就是說表達式可以用後面 for 循環迭代產生的變數,理解這個內容列表推導式就已經掌握 9 成內容了,剩下的是熟練度的問題。
在將 if 語句包含進代碼中,運行之後,你也能掌握基本技巧,if 語句是一個判斷,其中 i 也是前面循環產生的迭代變數。
nn_list = [i*2 for i in my_list if i>1]print(nn_list)優化兩層 for 循環這些都是一般技能,列表推導式能支持兩層 for 循環,例如下述代碼:
nn_list = [(x,y) for x in range(3) for y in range(3) ]print(nn_list)當然如果你想加密(誰都看不懂你的代碼)你的代碼,你可以無限套娃下去,列表推導式並沒有限制循環層數,多層循環就是一層一層的嵌套,你可以展開一個三層的列表推導式,就都明白了
nn_list = [(x,y,z,m) for x in range(3) for y in range(3) for z in range(3) for m in range(3)]print(nn_list)當然在多層列表推導式裡面,依舊支持 if 語句,並且 if 後面可以用前面所有迭代產生的變數,不過不建議超過 2 成,超過之後會大幅度降低你代碼的可閱讀性。
當然如果你希望你代碼更加難讀,下面的寫法都是正確的。
nn_list = [(x, y, z, m) for x in range(3) if x > 1 for y in range(3) if y > 1 for z in range(3) for m in range(3)]print(nn_list)nn_list = [(x, y, z, m) for x in range(3) for y in range(3) for z in range(3) for m in range(3) if x > 1 and y > 1]print(nn_list)nn_list = [(x, y, z, m) for x in range(3) for y in range(3) for z in range(3) for m in range(3) if x > 1 if y > 1]print(nn_list)現在你已經對列表推導式有比較直觀的概念了,列表推導式對應的英文是 list comprehension,有的地方寫作列表解析式,基於它最後的結果,它是一種創建列表的語法,並且是很簡潔的語法。
有了兩種不同的寫法,那咱們必須要對比一下效率,經測試小數據范圍影響不大,當循環次數到千萬級時候,出現了一些差異。
import timedef demo1():new_list = []for i in range(10000000):new_list.append(i*2)def demo2():new_list = [i*2 for i in range(10000000)]s_time = time.perf_counter()demo2()e_time = time.perf_counter()print("代碼運行時間:", e_time-s_time)運行結果:
# for 循環代碼運行時間: 1.3431036140000001# 列表推導式代碼運行時間: 0.9749278849999999在 Python3 中列表推導式具備局部作用域,表達式內部的變數和賦值只在局部起作用,表達式的上下文里的同名變數還可以被正常引用,局部變數並不會影響到它們。所以其不會有變數泄漏的問題。例如下述代碼:
x = 6my_var = [x*2 for x in range(3)]print(my_var)print(x)列表推導式還支持嵌套 參考代碼如下,只有想不到,沒有做不到的。
my_list = [1,2,3]new_list = []for i in my_list:new_list.append(i*2)print(new_list)0用於轉換數據可以將可迭代對象(一般是列表)中的數據,批量進行轉換操作,例如將下述列表所有元素翻兩倍。
my_list = [1,2,3]new_list = []for i in my_list:new_list.append(i*2)print(new_list)1代碼如下所示:
my_list = [1,2,3]new_list = []for i in my_list:new_list.append(i*2)print(new_list)2結果可以自行編譯運行。
掌握上述語法的關鍵點是 item ,請重點關注 item 從 my_list 遍歷而來,並且 item*2 尾部與 for 循環存在一個空格。
用於過濾數據列表表達式,可以將列表中滿足條件表達式的值進行篩選過濾,獲取目標數據。
my_list = [1,2,3]new_list = []for i in my_list:new_list.append(i*2)print(new_list)3掌握上述語法的關鍵是 if ,其餘要點是注意語法編寫結構。
接下來你可以嘗試將上述編程邏輯,修改為 for 循環語法,學習過程中要著重理解以上兩種語法結構可以相互轉換, 當你可以無縫將二者進行轉換時,該技能你就掌握了。
有些人會將列表推導式當做 for 循環的簡化版。
字典推導式有了列表推導式的概念,字典推導式學起來就非常簡單了,語法格式如下:
my_list = [1,2,3]new_list = []for i in my_list:new_list.append(i*2)print(new_list)4直接看案例即可
my_list = [1,2,3]new_list = []for i in my_list:new_list.append(i*2)print(new_list)5得到的結果如下:
my_list = [1,2,3]new_list = []for i in my_list:new_list.append(i*2)print(new_list)6此時需要注意的是字典中不能出現同名的 key,第二次出現就把第一個值覆蓋掉了,所以得到的 value 都是 1。
最常見的哪裡還是下述的代碼,遍歷一個具有鍵值關系的可迭代對象。
my_list = [1,2,3]new_list = []for i in my_list:new_list.append(i*2)print(new_list)7元組推導式與集合推導式其實你應該能猜到,在 Python 中是具備這兩種推導式的,而且語法相信你已經掌握了。不過語法雖然差不多,但是元組推導式運行結果卻不同,具體如下。
my_list = [1,2,3]new_list = []for i in my_list:new_list.append(i*2)print(new_list)8運行之後產生的結果:
my_list = [1,2,3]new_list = []for i in my_list:new_list.append(i*2)print(new_list)9使用元組推導式生成的結果並不是一個元組,而是一個生成器對象,需要特別注意下,這種寫法在有的地方會把它叫做生成器語法,不叫做元組推導式。
集合推導式也有一個需要注意的地方,先看代碼:
nn_list = [i*2 for i in my_list]print(nn_list)0因為集合是無序且不重復的,所以會自動去掉重復的元素,並且每次運行顯示的順序不一樣,使用的時候很容易暈掉。
提高場景再次查看推導式語法結構中,涉及了一個關鍵字,叫做 可迭代對象,因為我們可以把自己目前掌握的所有可迭代對象, 都進行一下嘗試,例如使用 range() 函數。
nn_list = [i*2 for i in my_list]print(nn_list)1檢驗是否掌握,可以回答下述兩個問題。
如果可迭代對象是一個字典,你該如何操作?
如果可迭代對象位置使用了 enumerate() 函數,你該如何操作?
除了可迭代對象部分可以擴展知識點, if 表達式 中的 條件表達式 也支持各種布爾運算,如果用中文進行翻譯, 表示把滿足條件的元素,放置到新的列表中。
擴展知識由於列表推導式涉及了數據類型,所以可大膽推斷,還存在其它推導式語法,Python 也確實是這樣設計的。
你可以繼續學習下述內容,而且知識結構基本一致。
字典推導式
集合推導式
生成器推導式
列表推導式的學習,不要過於在意細節,也無需要求學會即掌握,因為該知識點屬於語法糖(編程小技巧), 所以在初學階段,了解即可,隨著編程學習的深入,你會自然而然的將可用推導式的地方,修改為推導式。
原文:https://juejin.cn/post/7101477530615414797