Python面試題解答——第一部分

文件操作

1.有一個jsonline格式的文件file.txt大小約爲10K

def get_lines():
    with open('file.txt','rb') as f:
        return f.readlines()

if __name__ == '__main__':
    for e in get_lines():
        process(e) # 處理每一行數據

現在要處理一個大小爲10G的文件,但是內存只有4G,如果在只修改get_lines 函數而其他代碼保持不變的情況下,應該如何實現?需要考慮的問題都有那些?

def get_lines():
    with open('file.txt','rb') as f:
        for i in f:
            yield i
from mmap import mmap


def get_lines(fp):
    with open(fp,"r+") as f:
        m = mmap(f.fileno(), 0)
        tmp = 0
        for i, char in enumerate(m):
            if char==b"\n":
                yield m[tmp:i+1].decode()
                tmp = i+1

if __name__=="__main__":
    for i in get_lines("fp_some_huge_file"):
        print(i)

要考慮的問題有:內存只有4G無法一次性讀入10G文件,需要分批讀入分批讀入數據要記錄每次讀入數據的位置。分批每次讀取數據的大小,太小會在讀取操作花費過多時間

模塊與包  

3.輸入日期, 判斷這一天是這一年的第幾天?

import datetime
def dayofyear():
    year = input("請輸入年份: ")
    month = input("請輸入月份: ")
    day = input("請輸入天: ")
    date1 = datetime.date(year=int(year),month=int(month),day=int(day))
    date2 = datetime.date(year=int(year),month=1,day=1)
    return (date1-date2).days+1

4.打亂一個排好序的list對象alist?

import random
alist = [1,2,3,4,5]
random.shuffle(alist)
print(alist)

數據類型  

5.現有字典 d= {'a':24,'g':52,'i':12,'k':33}請按value值進行排序?

sorted(d.items(),key=lambda x:x[1])
x[0]代表用key進行排序;x[1]代表用value進行排序。

7.請反轉字符串 "aStr"?

print("aStr"[::-1])

 8.將字符串 "k:1 |k1:2|k2:3|k3:4",處理成字典 {k:1,k1:2,...}

str1 = "k:1|k1:2|k2:3|k3:4"
def str2dict(str1):
    dict1 = {}
    for iterms in str1.split('|'):
        key,value = iterms.split(':')
        dict1[key] = value
    return dict1
#字典推導式
d = {k:int(v) for t in str1.split("|") for k, v in (t.split(":"), )}

 

9.請按alist中元素的age由大到小排序

alist = [{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}]
def sort_by_age(list1):
    return sorted(alist,key=lambda x:x['age'],reverse=True)

10.下面代碼的輸出結果將是什麼?

list = ['a','b','c','d','e'] 
print(list[10:])

代碼將輸出[],不會產生IndexError錯誤,就像所期望的那樣,嘗試用超出成員的個數的index來獲取某個列表的成員。例如,嘗試獲取list[10]和之後的成員,會導致IndexError。然而,嘗試獲取列表的切片,開始的index超過了成員個數不會產生IndexError,而是僅僅返回一個空列表。這成爲特別讓人噁心的疑難雜症,因爲運行的時候沒有錯誤產生,導致Bug很難被追蹤到。

11.寫一個列表生成式,產生一個公差爲11的等差數列

print([x*11 for x in range(10)])

12.給定兩個列表,怎麼找出他們相同的元素和不同的元素?

list1 = [1,2,3]
list2 = [3,4,5]
set1 = set(list1)
set2 = set(list2)
print(set1 & set2)
print(set1 ^ set2)

13.請寫出一段python代碼實現刪除list裏面的重複元素?

l1 = ['b','c','d','c','a','a']
l2 = list(set(l1))
print(l2)

用list類的sort方法:
l1 = ['b','c','d','c','a','a']
l2 = list(set(l1))
l2.sort(key=l1.index)
print(l2)
也可以這樣寫:
l1 = ['b','c','d','c','a','a']
l2 = sorted(set(l1),key=l1.index)
print(l2)
也可以用遍歷:
l1 = ['b','c','d','c','a','a']
l2 = []
for i in l1:
    if not i in l2:
        l2.append(i)
print(l2)

14.給定兩個list A,B ,請用找出A,B中相同與不同的元素

A,B 中相同元素: print(set(A)&set(B)) A,B 中不同元素:  print(set(A)^set(B))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章