python面试题大全(一)

文件操作

1. 大文件读取问题

有一个jsonline格式的文件file.txt大小约为10K,如何读取内容?

#! -*-conding=: UTF-8 -*-
# 2024/1/19 16:46

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


if __name__ == '__main__':
    for line in get_lines():
        print(line)  # 处理每一行数据

现在要处理一个大小为10G的文件,但是内存只有4G,如果在只修改get_lines函数而其他代码保持不变的情况下,应该如何实现?需要考虑的问题都有那些?

#! -*-conding=: UTF-8 -*-
# 2024/1/19 16:46

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


if __name__ == '__main__':
    for line in get_lines():
        print(line)  # 处理每一行数据

个人认为:还是设置下每次返回的内容较好,否则读取次数太多。

#! -*-conding=: UTF-8 -*-
# 2024/1/19 16:46


def get_lines():
    with open('file.txt', 'r', encoding='utf-8') as f:
        _lines = []
        for line in f:
            _lines.append(line.strip())
            if len(_lines) == 2:
                yield _lines
                _lines = []
        if _lines:
            yield _lines


if __name__ == '__main__':
    for lines in get_lines():
        print(lines)  # 处理每两行数据

使用itertools

import itertools


def get_lines(line):
    with open('file.txt', 'r', encoding='utf-8') as f:
        while True:
            _lines = list(itertools.islice(f, line))
            if len(_lines) < line:
                yield [line.strip() for line in _lines]
                break
            yield [line.strip() for line in _lines]


if __name__ == '__main__':
    for lines in get_lines(2):
        print(lines)  # 处理每两行数据

使用mmap库

from mmap import mmap


def get_lines(fp):
    with open(fp, "r+") as f:
        m = mmap(f.fileno(), 0)
        start = 0
        while True:
            pos = m.find(b"\n", start)
            if pos == -1:
                break
            yield m[start:pos + 1].decode()
            start = pos + 1


if __name__ == '__main__':
    for lines in get_lines('file.txt'):
        print(lines)  # 处理每两行数据

要考虑的问题有:

  • 内存只有4G无法一次性读入10G文件,需要分批读入分批读入数据要记录每次读入数据的位置。
  • 分批每次读取数据的大小,太小会在读取操作花费过多时间。

https://stackoverflow.com/questions/30294146/fastest-way-to-process-a-large-file

2. 目录遍历

请打印指定目录的目录树

#! -*-conding=: UTF-8 -*-
# 2024/1/19 16:46
import os


def print_directory_contents(s_path):
    """
    这个函数接收文件夹的名称作为输入参数
    返回该文件夹中文件的路径
    以及其包含文件夹中文件的路径
    """

    for s_child in os.listdir(s_path):
        s_child_path = os.path.join(s_path, s_child)
        if os.path.isdir(s_child_path):
            print_directory_contents(s_child_path)
        else:
            print(s_child_path)


if __name__ == '__main__':
    print_directory_contents('.')

模块与包

3.输入日期, 判断这一天是这一年的第几天?

#! -*-conding=: UTF-8 -*-
# 2024/1/19 16:46
import datetime


def day_of_year():
    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


if __name__ == '__main__':
    print(day_of_year())

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值进行排序?

d = {
   'a': 24, 'g': 52, 'i': 12, 'k': 33}

# 升序
d_set = sorted(d.items(), key=lambda x: x[1], reverse=False)
print(d_set)  # [('i', 12), ('a', 24), ('k', 33), ('g', 52)]

# 降序
print(sorted(d.items(), key=lambda x: x[1], reverse=True))
# [('g', 52), ('k', 33), ('a', 24), ('i', 12)]

x[0]代表用key进行排序;x[1]代表用value进行排序。

6.字典推导式

创建一个字典,将列表中的元素作为键,元素的平方作为值

my_list = [1, 2, 3, 4, 5]
my_dict = {
   x: x**2 for x in my_list}
print(my_dict)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

7.请反转字符串 “aStr”?

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

8.将字符串 “k:1 |k1:2|k2:3|k3:4”,处理成字典 {k:1,k1:2,…}

def process_string_to_dict(input_string):
    # 去除字符串中的空格
    input_string = input_string.replace(" ", "")

    # 拆分字符串成键值对列表
    pairs = input_string.split("|")

    # 创建字典
    my_dict = {
   }
    for pair in pairs:
        key, value = pair.split(":")
        my_dict[key] = int(value)

    return my_dict


# 调用函数并打印结果
my_string = "k:1 |k1:2|k2:3|k3:4"
result_dict = process_string_to_dict(my_string)
print(result_dict)  # {'k': 1, 'k1': 2, 'k2': 3, 'k3': 4}

# 字典推导式
print({
   k: int(v) for t in my_string.split("|") for k, v in (t.split(":"),)})
# {'k': 1, 'k1': 2, 'k2': 3, 'k3': 4}

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

alist = [{
   'name': 'a', 'age': 20}, {
   'name': 'b', 'age': 30}, {
   'name': 'c', 'age': 25}]


def sort_by_age(list1):
    return sorted(list1, key=lambda x: x['age'], reverse=True)


print(sort_by_age(alist))
# [{'name': 'b', 'age': 30}, {'name': 'c', 'age': 25}, {'name': 'a', 'age': 20}]

10.下面代码的输出结果将是什么?

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

11.写一个列表生成式,产生一个公差为11的等差数列

print([x*11 for x in range(10)])  # [0, 11, 22, 33, 44, 55, 66, 77, 88, 99]

12.给定两个列表,怎么找出他们相同的元素和不同的元素?

list1 = [1, 2, 3]
list2 = [3, 4, 5]

set1 = set(list1)
set2 = set(list2)

print(set1 & set2)  # {3}
print(set1 ^ set2)  # {1, 2, 4, 5}

13.请写出一段python代码实现删除list里面的重复元素?

def duplicate_removal1(a):
    """使用集合去重"""
    a = list(set(a))
    print(a)


def duplicate_removal2(a):
    """将一个列表的数据取出放到另一个列表中,中间作判断"""
    alist = []
    for i in a:
        if i not in alist:
            alist.append(i)
    # 如果需要排序的话用sort
    alist.sort()
    print(alist)


def duplicate_removal3(a):
    """使用字典"""
    b = {
   }
    b = b.fromkeys(a)
    c = list(b.keys())
    print(c)


al = [1, <
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海哥python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值