列表與字典的幾個進階操作


  小結幾個有關列表與字典常見的幾個簡單用法:

  1.zip()方法

  (1)利用zip方法我們可以將兩個相關的列表結合成一個由這兩個列表中元素構成的“鍵值對”的字典:

l1 = ['name','age','gender']
l2 = ['whw',27,'male']
dic = dict(zip(l1,l2))

  結果如下:

  (2)當然我們也可以做一個比較復雜的操作:

  w.txt文件中有如下信息:

1,Alex Li,22,13651054608,IT,2013-04-01
2,Jack Wang,28,13451024608,HR,2015-01-07
3,Rain Wang,21,13451054608,IT,2017-04-01
4,Mack Qiao,44,15653354208,Sales,2016-02-01
5,Rachel Chen,23,13351024606,IT,2013-03-16
6,Eric Liu,19,18531054602,Marketing,2012-12-01
7,Chao Zhang,21,13235324334,Administration,2011-08-08
8,Kevin Chen,22,13151054603,Sales,2013-04-01
9,Shit Wen,20,13351024602,IT,2017-07-03
10,Shanshan Du,26,13698424612,Operation,2017-07-02

  現在需要我們將這個數據轉化為一個字典,這個字典的格式為:key值為文件中的名字,對應的value為新生成的一個字典,這個字典里面的鍵值對是新生成鍵值對應關系:

staff_table = {}
field_list = ["num", "name", "age", "phone", "dept", "enroll_date"]

def openfile():
    staff_file = open("staffinfo.txt", 'r+', encoding='utf-8')
    for line in staff_file:
        line = line.strip().split(',')
        staff_table[line[1]] = dict(zip(field_list, line[:6]))

if __name__ == "__main__": openfile() print(staff_table)

  結果為:

{'Alex Li': {'num': '1', 'name': 'Alex Li', 'age': '22', 'phone': '13651054608', 'dept': 'IT', 'enroll_date': '2013-04-01'}, 
'Jack Wang': {'num': '2', 'name': 'Jack Wang', 'age': '28', 'phone': '13451024608', 'dept': 'HR', 'enroll_date': '2015-01-07'}, 
'Rain Wang': {'num': '3', 'name': 'Rain Wang', 'age': '21', 'phone': '13451054608', 'dept': 'IT', 'enroll_date': '2017-04-01'}, 
'Mack Qiao': {'num': '4', 'name': 'Mack Qiao', 'age': '44', 'phone': '15653354208', 'dept': 'Sales', 'enroll_date': '2016-02-01'},
 'Rachel Chen': {'num': '5', 'name': 'Rachel Chen', 'age': '23', 'phone': '13351024606', 'dept': 'IT', 'enroll_date': '2013-03-16'}, 
'Eric Liu': {'num': '6', 'name': 'Eric Liu', 'age': '19', 'phone': '18531054602', 'dept': 'Marketing', 'enroll_date': '2012-12-01'}, 
'Chao Zhang': {'num': '7', 'name': 'Chao Zhang', 'age': '21', 'phone': '13235324334', 'dept': 'Administration', 'enroll_date': '2011-08-08'},
 'Kevin Chen': {'num': '8', 'name': 'Kevin Chen', 'age': '22', 'phone': '13151054603', 'dept': 'Sales', 'enroll_date': '2013-04-01'}, 
'Shit Wen': {'num': '9', 'name': 'Shit Wen', 'age': '20', 'phone': '13351024602', 'dept': 'IT', 'enroll_date': '2017-07-03'},
 'Shanshan Du': {'num': '10', 'name': 'Shanshan Du', 'age': '26', 'phone': '13698424612', 'dept': 'Operation', 'enroll_date': '2017-07-02'}}

  上面的例子很巧妙的利用了zip方法,將新的由key值組成的列表與每個line的切片(列表)構成一個新的字典。這個方法值得我們學習!

  2.map()方法:

  map()方法是利用一個函數操作列表,然后返回的是一個操作后的新列表,比如,我們要實現返回一個由數字組成的列表中各個元素平方的新列表:

a = map(lambda x:x**2,[1,2,3,4])

  這里需要注意的是:在python3中返回的是一個迭代器,所以我們需要這樣取值:

  2.1利用map方法規范英文名:首字母大寫,后面的字母都小寫:

  (1)一個比較low的方式可以這樣實現:

names = ['wanghw','wjwj','WFJK']
def format_name(name):
    return name[0].upper()+name[1:].lower()
names_new = map(format_name,names)
for i in names_new:
    print(i)
#在python3中也可以print(list(name_new))

  結果為

  (2)我們也可以利用python自帶的capitalize方法:

names = ['wanghw','wjwj','WFJK']
def format_name(name):
    return name.capitalize()
names_new = map(format_name,names)
for i in names_new:
    print(i)

  當然,也可以利用lambda方法可以節省代碼:

names = ['wanghw','wjwj','WFJK']
names_new = map(lambda x:x.capitalize(),names)
for i in names_new:
    print(i)

  結果是完全一樣的。

  3.filter()方法:

  filter()函數接受一個函數f與一個list,這個函數f的作用是對每個元素進行判斷,返回True或者False。filter函數根據判斷的結果自動過濾掉不符合條件的元素,返回由符合條件的元素組成的list。

  比如,返回列表中的奇數,可以這樣做:

def is_odd(num):
    return num % 2 == 1

filter(is_odd,[1,2,3,4,5])  

  當然,filter在python3中返回的也是一個可迭代的對象,所以我們可以這樣取值:

  (1)我們可以利用filter函數過濾掉列表中值為None或者空字符:

list1 = ['ww','hh','','',None,'wf']
def is_not_empty(s):
    return s and len(s.strip())>0
a = filter(is_not_empty,list1)
for i in a:
    print(i)

結果為:

  (2)利用filter過濾掉1--100中平方根為整數的數字

import math
def func(num):
    return math.sqrt(num) and int(math.sqrt(num))==math.sqrt(num)

a = filter(func,range(1,101))
for i in a:
    print(i)

  結果為:

  4.sorted()方法:

  sorted方法用於排序操作。注意sort()方法僅能用於列表,而sorted()方法可以用於任何可迭代的對象,所以我們這里介紹一下sorted方法。sorted方法默認排序方式為升序。

  值得注意的一點是,sorted方法是保留原來的數據的,比如我們要對a = [1,4,6,3,2]進行排序:

  原來的列表a是不變的!

  (1)對列表l = [('b',2),('a',1),('c',3)]按照數字排序:

l = [('b',2),('a',1),('c',3)]
a = sorted(l,key=lambda x:x[1])
print(a)

結果為:

[('a', 1), ('b', 2), ('c', 3)]

  (2)對列表students = [('w','A',15),('h','A',16),('j','A',25)]按照數字的降序排序

students = [('w','A',15),('h','A',16),('j','A',25)]
a = sorted(students,key=lambda x:x[2],reverse=True)
print(a)

  結果為:

[('j', 'A', 25), ('h', 'A', 16), ('w', 'A', 15)]

   需要注意的是,python3中sorter沒有cmp,排序是按照key跟reverse來的:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM