Python | 练习题<8>

28 阅读5分钟

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

示例:

数组1:[1,4,1,6],返回值:[4,6]

数组2:[1,2,3,3,2,9],返回值:[1,9]

def find_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}的结果为{find_one(nums1)}")
print(f"数组{nums2}的结果为{find_one(nums2)}")

运行结果:

1.png

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

示例:

strs1 = ["flower", "flow", "flight"] result="fl"

strs2 = ["dog", "racecar", "car"] result=""

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

运行结果:

2.png

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。

示例:

  • s1 = "()[]{}"
  • s2 = "(]"
  • s3 = "([)]"
  • s4 = "{[]}"
def match_strs(str):
    stack = [] # 创建一个栈
    dc = {
        ']':'[',
        '}':'{',
        '(':')'
    }
    for s in str: # 遍历字符串str
        if s in dc: # 如果s是右括号
            if not stack:
                return False
            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))

运行结果:

3.png

题目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
df = pd.read_csv(
    "用户行为.csv",
    encoding="utf-8",
    index_col="用户ID"
)
print(df)

运行结果:

4.png

1. 计算不同用户等级的平均浏览时长、平均下单次数和平均支付金额(提示:使用 groupby 分组统计)。
mean_data = df.groupby('用户等级(1-5级)').agg(
    {'浏览时长(分钟)':'mean',
     '下单次数':'mean',
     '支付金额(元)':'mean'
     }
)
mean_data = mean_data.rename(columns={'浏览时长(分钟)':'平均浏览时长(分钟)',
                                      '下单次数':'平均下单次数','支付金额(元)':'平均支付金额(元)'})
print(mean_data)

运行结果:

11.png

  1. 计算所有用户的 “支付金额” 的最大值、最小值、标准差和中位数。
states = df['支付金额(元)'].agg(['max', 'min', 'std', 'median'])
print(states)

运行结果:

22.png

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

运行结果:

6.png

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

运行结果:

7.png

完整代码:

import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv(
    "用户行为.csv",
    encoding="utf-8",
    index_col="用户ID"
)
print(df)
# 1. 计算不同用户等级的平均浏览时长、平均下单次数和平均支付金额(提示:使用 groupby 分组统计)。
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()