python练习题9

39 阅读3分钟

题目1:一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

示例: 数组1:[1,4,1,6],返回值:[4,6] 数组2:[1,2,3,3,2,9],返回值:[1,9]

def fine_one(nums):
    dc = {} # 空字典,存放{数字:出现次数}
    for num in nums:
        if num not in dc: # 当数字num不在dc中
            dc[num] = 1 # 数字num第一次出现
        else:  # dc已经有num了
            dc[num] += 1 # num次数=1
    result = [] # 存放结果
    for key,value in dc.items(): # 寻找只出现一次的数字
        if value == 1:
            result.append(key)
    return result
# 测试用例
nums1 = [1,4,1,6]
nums2 = [1,2,3,3,2,9]
print(f"数组{nums1}的结果为{fine_one(nums1)}")
print(f"数组{nums2}的结果为{fine_one(nums2)}")

题目2:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。

示例: strs1 = ["flower", "flow", "flight"] result="fl" strs2 = ["dog", "racecar", "car"] result=""

def find_longgest(strs):
    if not strs:
        return ""
    for i in range(len(strs[0])):  # 依次遍历第一个元素的每个字符
        for str in strs[1:]:
            if strs[0][i] != str[i] or i >= len(str):
                return strs[0][:i]
    return strs[0]
# 测试用例
strs1 = ["flower", "flow", "flight"]
strs2 = ["dog", "racecar", "car"]
print(find_longgest(strs1))
print(find_longgest(strs2))

题目3:给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。

有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 示例: s1 = "()[]{}" s2 = "(]" s3 = "([)]" s4 = "{[]}

def match_strs(str):
    stack = []
    dc = {
        ']':'[',
        '}':'{',
        ')':'('
    }
    for s in str:  # 遍历字符串str
        if s in dc: # 如果s是右括号
            tmp = stack.pop() # 弹出栈顶元素
            if tmp != dc[s]: # 不匹配
                return False
        else: # 如果s是左括号
            stack.append(s) # 将左括号加入栈中
    return not stack # 如果栈为空,代表括号匹配
# 匹配用例
s1 = "()[]{}"
s2 = "(]"
s3 = "([)]"
s4 = "{[]}"
print(match_strs(s1))
print(match_strs(s2))
print(match_strs(s3))
print(match_strs(s4))

题目4:电商用户行为数据分析

现有电商平台用户行为数据 CSV 文件“用户行为.csv”,包含字段:“用户 ID”“浏览时长 (分钟)”“下单次数”“支付金额 (元)”“用户等级 (1-5 级)”。 请使用 Python 的 pandas、numpy 和 matplotlib 库完成以下任务: 读取 CSV 文件数据到 DataFrame。

  1. 计算不同用户等级的平均浏览时长、平均下单次数和平均支付金额(提示:使用 groupby 分组统计)。
  2. 计算所有用户的 “支付金额” 的最大值、最小值、标准差和中位数。
  3. 为每位用户添加 “单均支付金额” 列(支付金额 / 下单次数)。
  4. 绘制不同用户等级的 “平均支付金额” 柱状图,横轴为用户等级,纵轴为平均支付金额。
import pandas as pd
import matplotlib.pyplot as plt
# 1. 计算不同用户等级的平均浏览时长、平均下单次数和平均支付金额(提示:使用 groupby 分组统计)。
df = pd.read_csv(
    "用户行为.csv",
    encoding="utf-8",
    index_col="用户ID"
)
print(df)

mean_data = df.groupby('用户等级(1-5级)').agg(
    {'浏览时长(分钟)':'mean',
     '下单次数':'mean',
     '支付金额(元)':'mean'
     }
)
mean_data = mean_data.rename(columns={'浏览时长(分钟)':'平均浏览时长(分钟)',
                                      '下单次数':'平均下单次数','支付金额(元)':'平均支付金额(元)'})
print(mean_data)
# 2. 计算所有用户的 “支付金额” 的最大值、最小值、标准差和中位数。
states = df['支付金额(元)'].agg(['max' , 'min' , 'std' , 'median'])
print(states)

# 3. 为每位用户添加 “单均支付金额” 列(支付金额 / 下单次数)。
df['单均支付金额'] = df['支付金额(元)'] / df['下单次数']
df = df.fillna(0)
print(df)

# 4. 绘制不同用户等级的 “平均支付金额” 柱状图,横轴为用户等级,纵轴为平均支付金额。
plt.bar(mean_data.index, mean_data['平均支付金额(元)'])
plt.show()