python之高效處理字典、序列的一些語法

知識點記錄:

1.序列相關

  • 使用deque 進行保留最後N個元素
a = deque(maxlen=3)
a.append(2)
a.appendleft(1)
a.append(3)
a.append(4)
# a.pop()  也能夠 a.leftpop()
# 輸出
[2, 3, 4]
# ps: 在隊列兩端插入或刪除元素時間複雜度都是 O(1) ,區別於列表,在列表的開頭插入或刪除元素的時間複雜度爲 O(N)
  • 查找最大或者最小的幾個元素
import heapq
nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
print(heapq.nlargest(3, nums)) # Prints [42, 37, 23]
print(heapq.nsmallest(3, nums)) # Prints [-4, 1, 2]
  • 使用filter()過濾序列元素
values = ['1', '2', '-3', '-', '4', 'N/A', '5']
def is_int(val):
    try:
        x = int(val)
        return True
    except ValueError:
        return False
ivals = list(filter(is_int, values))
print(ivals)
# Outputs ['1', '2', '-3', '4', '5']

用 iterable 中函數 function 返回真的那些元素,構建一個新的迭代器。iterable 能夠是一個序列,一個支持迭代的容器,或一個迭代器。若是 function 是 None ,則會假設它是一個身份函數,即 iterable 中全部返回假的元素會被移除。數據庫

請注意, filter(function, iterable) 至關於一個生成器表達式,當 function 不是 None 的時候爲 (item for item in iterable if function(item));function 是 None 的時候爲 (item for item in iterable if item) 。app

2.字典相關

  • 使用 from collections import OrderDict 會默認按照插入的順序進行排序,能夠在數據庫查出來數據進行拼裝時候不須要轉換爲列表排序
  • 使用 sorted函數進行排序 sorted(zip(prices.values(), prices.keys())) 能夠先將字典的key和value進行反轉映射,而後就sorted排序,默認會按照元祖中的第一個值進行排序
  • 按照指定的元素進行排序
from oprator import itemgetter
# 這個方法能夠代替匿名函數,而且效率更高
rows = [
    {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
    {'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
    {'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
    {'fname': 'Big', 'lname': 'Jones', 'uid': 1004}
]
rows_by_uid = sorted(rows, key=itemgetter('uid'))
等同於
rows_by_uid = sorted(rows, key=lambda r: r['uid'])
# 也同時支持多 key進行排序
rows_by_lfname = sorted(rows, key=itemgetter('lname','fname'))
  • 按照字典中的對象屬性去進行排序
class Age:
    def __init__(self, number):
        self.number = number

    def __repr__(self):
        return 'Age({})'.format(self.number)


def sort_notcompare():
    ages = [Age(23), Age(3), Age(99)]
    print(ages)
    # 匿名函數方式
    print(sorted(ages, key=lambda a: a.number))   
    # attrgetter 方式  效率更高
    from operator import attrgetter
    sorted(ages, key=attrgetter('number'))
  • 對列表中的字典序列進行分組
from operator import itemgetter
from itertools import groupby  # 使用groupby  進行分組
rows = [
    {'address': '5412 N CLARK', 'date': '07/01/2012'},
    {'address': '5148 N CLARK', 'date': '07/04/2012'},
    {'address': '5800 E 58TH', 'date': '07/02/2012'},
    {'address': '2122 N CLARK', 'date': '07/03/2012'},
    {'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},
    {'address': '1060 W ADDISON', 'date': '07/02/2012'},
    {'address': '4801 N BROADWAY', 'date': '07/01/2012'},
    {'address': '1039 W GRANVILLE', 'date': '07/04/2012'},
]
rows.sort(key=itemgetter('date'))
# Iterate in groups
for date, items in groupby(rows, key=itemgetter('date')):
    print(date)
    for i in items:
        print (i)
# 輸出結果:
07/01/2012
  {'date': '07/01/2012', 'address': '5412 N CLARK'}
  {'date': '07/01/2012', 'address': '4801 N BROADWAY'}
07/02/2012
  {'date': '07/02/2012', 'address': '5800 E 58TH'}
  {'date': '07/02/2012', 'address': '5645 N RAVENSWOOD'}
  {'date': '07/02/2012', 'address': '1060 W ADDISON'}
07/03/2012
  {'date': '07/03/2012', 'address': '2122 N CLARK'}
07/04/2012
  {'date': '07/04/2012', 'address': '5148 N CLARK'}
  {'date': '07/04/2012', 'address': '1039 W GRANVILLE'}
相關文章
相關標籤/搜索