力扣刷题总结(总结10道发布一次)

1.pandas.loc()方法

def invalid_tweets(tweets: pd.DataFrame) -> pd.DataFrame:
   return tweets.loc[(tweets['content'].str.len()>15),'tweet_id']

运行上面代码报错提示,返回的是Series结构。因为.loc方法在指定单个列名时没有使用方括号,导致返回的是一个Series对象,而不是函数签名中声明的DataFrame。在Pandas中,当使用.loc并指定单个列名时,即使没有使用方括号,返回的也是一个Series,而不是DataFrame。在.loc方法中使用方括号来指定列名,即使只选择一列。这样可以保证返回的数据结构与函数签名一致。

loc()方法如果没有指定第二个参数(列名),将返回符合条件该行所有的元素。

2.

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
      length=len(nums)
      for i in range(0,length):
        for j in range(i+1,length):
            if nums[j]==target-nums[i]:
                return [i,j]

这道题一直报错的原因是,range函数的用法,误认为range(0,i)是从0到i,其实是从0到i-1

3.python画柱状图

将生成不同分类器在不同指标的性能,我之前错误的认为先生成一个指标刻度下所有分类器的性能,然后再生成下一个指标刻度下分类器的性能。其实是生成一个分类器在所有不同指标的性能,然后再生成下一个分类器的不同指标的性能。


svm=[accuracy_SVM,f1_SVM,precision_SVM,recall_SVM]
rf=[accuracy_RF,f1_RF,precision_RF,recall_RF]
dt=[accuracy_DT,f1_DT,precision_DT,recall_DT]
matplotlib.rcParams['font.family']='SimHei' # 添加中文字体
x=np.arange(4)
xticks=['Accuracy','F1','Precision','Recall']
plt.bar(x - 0.2, svm, width=0.2, label='SVM')
plt.bar(x, rf, width=0.2, label='RF')
plt.bar(x + 0.2, dt, width=0.2, label='DT')
plt.xticks(x, xticks)
plt.legend()
plt.title('不同分类器性能对比')
plt.xlabel('指标',fontsize=14)
plt.ylabel('值',fontsize=14)
plt.show()

4.OS 文件操作

使用os.listdir()列出当前目录下的所有文件和目录

os.path.join() 函数是 Python 中 os.path 模块的一个非常有用的函数,它用于将多个路径组件合并成一个完整的路径。

import os
PATH="C:\\Users\\31911\\Desktop\\ML\\train\\NORMAL"
for name in os.listdir(PATH):
    img_path=os.path.join(PATH,name)
    print(img_path)

5.

我的答案:

def romanToInt(self, s: str) -> int:
        data={'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
        result=data[s[0]]
        for i in range(1,len(s)-1):
            if len(s)==2:
                if data[s[1]]>data[s[0]]:
                    result=data[s[1]]-data[s[0]]
                else:
                    result=data[s[1]]+data[s[0]]
            else:
                if  data[s[i]]<data[s[i+1]]:
                     result-=data[s[i]]
                else:
                    result+=data[s[i]]
        result=data[s[-1]]+result
        return result

正确答案:

def romanToInt(self, s: str) -> int:
        a={'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
        ans=0        
        for i in range(len(s)):
             if i<len(s)-1 and a[s[i]]<a[s[i+1]]:
                ans-=a[s[i]]
             else:
                ans+=a[s[i]]
        return ans

相比于正确答案,我给出的题解无疑是丑陋的,我把len(s)=2的情况单独拎了出来,但是可以用相同的逻辑处理这个特殊情况,并且就算计算出len(s)=2的情况最后的结果还是被覆盖掉了。

此外本题还涉及到一个enumerate()函数的用途。

enumerate(iterable, start=0)

  • iterable:一个可迭代对象,比如列表、元组、字符串等。
  • start(可选参数):一个整数,指定索引的起始值,默认为0。

此外最初访问字典的键和值最初想到的是用items()方法,其实直接通过索引的方法可以直接获取键对应的值。

6.HOG提取图像特征

def load_images_from_folder(folder):
    images = []
    labels = []
    hog_descriptor = cv2.HOGDescriptor()
    for filename in os.listdir(folder):
        img_path = os.path.join(folder, filename)
        img = cv2.imread(img_path)
        if img is not None:
            img = cv2.resize(img, (64, 128))  # 调整图像大小
            img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换为灰度图
            hog_features = hog_descriptor.compute(img_gray)
            #print(hog_features.shape)
            hog_features = hog_features.flatten()
            images.append(hog_features)  # 扁平化图像
            labels.append(folder.split("\\")[-1] == 'NORMAL')  # 生成标签
    return np.array(images), np.array(labels)

(1)使用HOG特征提取时,只支持具有两个空间维度的图像。cv2.imread 读取的图像默认是BGR格式的三通道图像,OpenCV的HOGDescriptor期望输入是单通道的灰度图像。

  • 第三个数字 (3) 表示图像的通道数,这里是3,意味着图像是彩色的,并且使用RGB(红绿蓝)颜色模型。

(2)HOG特征的计算依赖于图像被划分为多个小块(blocks)和单元(cells)。每个块由多个单元组成,每个单元收集一定数量的梯度方向直方图。如果图像尺寸不是块尺寸的整数倍,计算可能会失败或导致错误。将图像缩放到 (64, 64) 可能会导致特征矩阵的大小超出了OpenCV内部处理的限制,尤其是在高分辨率图像上。而 (64, 128) 可能在内存使用和内部处理上更为合适。(为什么将 img = cv2.resize(img, (64, 64)) 这句话改为 img = cv2.resize(img, (64, 128)) 错误就解决了)

7.Numpy 的基本概念

NumPy数组 和 原生Python Array(数组)之间有几个重要的区别:

NumPy 数组在创建时具有固定的大小,与Python的原生数组对象不同,更改ndarray的大小将创建一个新数组并删除原来的数组。NumPy 数组元素需具有相同的数据类型,因此在内存中的大小相同。NumPy 数组有助于对大量数据进行高级数学和其他类型的操作。通常,这些操作的执行效率更高,比使用Python原生数组的代码更少。越来越多的基于Python的科学和数学软件包使用NumPy数组,但它们在处理之前会会将输入的数组转换为NumPy的数组。

为何使用 NumPy?

在 Python 中,我们有满足数组功能的列表,但是处理起来很慢。NumPy 旨在提供一个比传统 Python 列表快 50 倍的数组对象。NumPy 中的数组对象称为 ndarray,它提供了许多支持函数,使得利用 ndarray 非常容易。数组在数据科学中非常常用,因为速度和资源非常重要。数据科学:计算机科学的一个分支,研究如何存储、使用和分析数据以从中获取信息。

为什么 NumPy 比列表快?

与列表不同,NumPy 数组存储在内存中的一个连续位置,因此进程可以非常有效地访问和操纵它们。这种行为在计算机科学中称为引用的局部性。这是 NumPy 比列表更快的主要原因。它还经过了优化,可与最新的 CPU 体系结构一同使用。

NumPy的数组类被调用ndarray。这里需要注意的是numpy.array这与标准Python库类不同array.array,array.array只处理一维数组并提供较少的功能。ndarray对象有更重要的属性,具体如下:

ndarray.ndim - 数组的轴(维度)的个数。在Python世界中,维度的数量被称为rank。ndarray.shape - 数组的维度。这是一个整数的元组,表示每个维度中数组的大小。shape 元组的长度就是rank或维度的个数 ndim。ndarray.size - 数组元素的总数。这等于 shape 的元素的乘积。ndarray.dtype - 一个描述数组中元素类型的对象。可以使用标准的Python类型创建或指定dtype。另外NumPy提供它自己的类型。ndarray.itemsize - 数组中每个元素的字节大小。例如,元素为 float64 类型的数组的 itemsize 为8(=64/8)。ndarray.data - 该缓冲区包含数组的实际元素。通常,我们不需要使用此属性,因为我们将使用索引访问数组中的元素。

dtype 对象是使用以下语法构造的:

 numpy.dtype(object, align, copy)

object - 要转换为的数据类型对象align - 如果为 true,填充字段使其类似 C 的结构体。copy - 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用

8.Pandas 首字母大小写问题

问题描述:修复名字,使得只有第一个字符是大写的,其余都是小写的。

def fix_names(users: pd.DataFrame) -> pd.DataFrame:

     users["name"] = users["name"].str.capitalize()

     return users.sort_values("user_id")

str.title():

  1. 单词边界str.title() 会识别字符串中的单词边界,并只将每个单词的首字母转换为大写。单词边界通常由空格、标点符号或特定字符分隔。

  2. 转换规则:除了将首字母转换为大写外,该方法还会将单词中除首字母外的所有字母转换为小写。

  3. 非字母字符:如果字符串中包含非字母字符,这些字符将保持不变。

  4. 连续大写字母:如果字符串中有连续的大写字母(如缩写或专有名词),str.title() 可能不会按照预期工作,因为它会将这些连续大写字母的第一个字母转换为小写。

  5. 使用场景:这个方法适用于需要将文本格式化为标题形式的情况,例如书籍标题、文章标题等。

str.capitalize():

  1. 首字母大写:该方法将字符串的第一个字母转换为大写,无论它原本是大写还是小写。

  2. 其余字母小写:除了首字母外,字符串中的其他字母都会被转换为小写。

  3. 空字符串:如果字符串为空,str.capitalize() 会返回一个空字符串。

  4. 非字母字符:字符串中的非字母字符不会被转换,保持原样。

  5. 使用场景:这个方法适用于需要将文本的首字母大写的场景,例如在处理用户输入或生成文本时。

9.mysql数据表连接

内连接:获取两个表中字段匹配关系的记录。

SELECT a.nhooo_id, a.nhooo_author, b.nhooo_count FROM nhooo_tbl a INNER JOIN tcount_tbl b ON a.nhooo_author = b.nhooo_author;

左连接:获取左表所有记录,即使右表没有对应匹配的记录。

SELECT a.nhooo_id, a.nhooo_author, b.nhooo_count FROM nhooo_tbl a LEFT JOIN tcount_tbl b ON a.nhooo_author = b.nhooo_author;

右连接:与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

SELECT a.nhooo_id, a.nhooo_author, b.nhooo_count FROM nhooo_tbl a RIGHT JOIN tcount_tbl b ON a.nhooo_author = b.nhooo_author;

10.MYSQL 子查询 和limit 子句

问题描述:查询并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null(Pandas 则返回 None) 。

我自己写的:

select MAX(salary) AS  SecondHighestSalary
FROM  Employee
WHERE salary<(
 SELECT  MAX(salary)
 FROM  Employee

)

官方题解:

SELECT DISTINCT
    Salary AS SecondHighestSalary
FROM
    Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1
  • LIMIT 1表示从查询结果中只返回一条记录。
  • OFFSET 1表示在返回记录之前,先跳过前面的一条记录。由于记录已经按照薪水降序排列,所以跳过薪水最高的那条记录后,下一条记录就是薪水第二高的。
  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值