概述
列表(List)是App Inventor 2中最常用的数据结构。本文介绍列表的高级操作技巧,解决用户常见需求:
- 判断列表中有没有重复项
- 列表去重
- 列表排序
- 列表查找和过滤
- 列表交叉/差集操作
列表基础回顾
常用列表积木块
| 操作 | 积木块 | 说明 |
|---|---|---|
| 创建 | make a list | 创建列表 |
| 添加 | add items to list | 末尾添加元素 |
| 读取 | select list item | 按索引读取 |
| 长度 | length of list | 获取元素数量 |
| 是否在列表 | is in list? | 判断元素是否存在 |
| 索引 | index in list | 获取元素的索引 |
| 删除 | remove list item | 按索引删除 |
| 替换 | replace list item | 按索引替换 |
判断列表中有没有重复项
方法一:逐个比较
定义 是否有重复(列表) 返回 结果
设 i = 1
当 i ≤ 列表长度(列表) - 1
设 j = i + 1
当 j ≤ 列表长度(列表)
如果 列表第i项(列表) = 列表第j项(列表)
返回 true ' 找到重复
设 j = j + 1
设 i = i + 1
返回 false ' 没有重复
方法二:利用字典去重后比较长度
定义 是否有重复(列表) 返回 结果
设 去重后 = 列表去重(列表)
如果 列表长度(去重后) < 列表长度(列表)
返回 true
否则
返回 false
使用示例
当 按钮_检查.被点击
设 我的列表 = ["苹果", "香蕉", "橙子", "香蕉", "葡萄"]
如果 是否有重复(我的列表)
标签_结果.文本 = "⚠️ 列表中有重复项"
否则
标签_结果.文本 = "✅ 列表中没有重复项"
列表去重
方法一:利用字典键去重(推荐)
字典的键是唯一的,可以巧妙地用来去重:
定义 列表去重(列表) 返回 结果
设 去重列表 = 创建空列表
设 i = 1
当 i ≤ 列表长度(列表)
设 当前项 = 列表第i项(列表)
如果 非 (当前项 是否在 去重列表 中)
设 去重列表 = 添加列表项(去重列表, 当前项)
设 i = i + 1
返回 去重列表
方法二:保持顺序的去重
定义 有序去重(列表) 返回 结果
设 已见 = 创建空列表
设 结果列表 = 创建空列表
设 i = 1
当 i ≤ 列表长度(列表)
设 当前项 = 列表第i项(列表)
如果 非 (当前项 是否在 已见 中)
设 已见 = 添加列表项(已见, 当前项)
设 结果列表 = 添加列表项(结果列表, 当前项)
设 i = i + 1
返回 结果列表
获取重复项列表
定义 获取重复项(列表) 返回 重复列表
设 重复项 = 创建空列表
设 已见 = 创建空列表
设 i = 1
当 i ≤ 列表长度(列表)
设 当前项 = 列表第i项(列表)
如果 当前项 是否在 已见 中
如果 非 (当前项 是否在 重复项 中)
设 重复项 = 添加列表项(重复项, 当前项)
否则
设 已见 = 添加列表项(已见, 当前项)
设 i = i + 1
返回 重复项
统计每个元素出现次数
定义 统计频次(列表) 返回 频次字典
设 频次 = 创建空字典
设 i = 1
当 i ≤ 列表长度(列表)
设 当前项 = 列表第i项(列表)
如果 字典是否包含键(频次, 当前项)
设 当前次数 = 从字典 频次 获取 当前项
调用 字典.设键值(频次, 当前项, 当前次数 + 1)
否则
调用 字典.设键值(频次, 当前项, 1)
设 i = i + 1
返回 频次
列表排序
冒泡排序
定义 冒泡排序(列表) 返回 排序结果
设 排序列表 = 复制列表(列表)
设 n = 列表长度(排序列表)
设 i = 1
当 i ≤ n - 1
设 j = 1
当 j ≤ n - i
如果 列表第j项(排序列表) > 列表第(j+1)项(排序列表)
' 交换
设 临时 = 列表第j项(排序列表)
调用 替换列表项(排序列表, j, 列表第(j+1)项(排序列表))
调用 替换列表项(排序列表, j+1, 临时)
设 j = j + 1
设 i = i + 1
返回 排序列表
数字排序(从小到大)
定义 数字排序(列表) 返回 排序结果
设 排序列表 = 复制列表(列表)
设 n = 列表长度(排序列表)
设 i = 1
当 i ≤ n - 1
设 j = 1
当 j ≤ n - i
设 a = 文本转数字(列表第j项(排序列表))
设 b = 文本转数字(列表第(j+1)项(排序列表))
如果 a > b
设 临时 = 列表第j项(排序列表)
调用 替换列表项(排序列表, j, 列表第(j+1)项(排序列表))
调用 替换列表项(排序列表, j+1, 临时)
设 j = j + 1
设 i = i + 1
返回 排序列表
列表查找和过滤
查找所有匹配项
定义 查找全部(列表, 目标) 返回 索引列表
设 结果 = 创建空列表
设 i = 1
当 i ≤ 列表长度(列表)
如果 列表第i项(列表) = 目标
设 结果 = 添加列表项(结果, i)
设 i = i + 1
返回 结果
按条件过滤
定义 过滤大于(列表, 阈值) 返回 结果
设 结果 = 创建空列表
设 i = 1
当 i ≤ 列表长度(列表)
设 值 = 文本转数字(列表第i项(列表))
如果 值 > 阈值
设 结果 = 添加列表项(结果, 列表第i项(列表))
设 i = i + 1
返回 结果
模糊搜索
定义 模糊搜索(列表, 关键字) 返回 结果
设 结果 = 创建空列表
设 i = 1
当 i ≤ 列表长度(列表)
设 当前项 = 列表第i项(列表)
如果 文本是否包含(当前项, 关键字)
设 结果 = 添加列表项(结果, 当前项)
设 i = i + 1
返回 结果
列表集合操作
交集(两个列表共同元素)
定义 交集(列表A, 列表B) 返回 结果
设 结果 = 创建空列表
设 i = 1
当 i ≤ 列表长度(列表A)
如果 列表第i项(列表A) 是否在 列表B 中
设 结果 = 添加列表项(结果, 列表第i项(列表A))
设 i = i + 1
返回 列表去重(结果)
差集(在A但不在B中)
定义 差集(列表A, 列表B) 返回 结果
设 结果 = 创建空列表
设 i = 1
当 i ≤ 列表长度(列表A)
如果 非 (列表第i项(列表A) 是否在 列表B 中)
设 结果 = 添加列表项(结果, 列表第i项(列表A))
设 i = i + 1
返回 结果
合并去重
定义 合并去重(列表A, 列表B) 返回 结果
设 合并 = 合并列表(列表A, 列表B)
返回 列表去重(合并)
实用工具函数
列表转逗号分隔文本
定义 列表转文本(列表, 分隔符) 返回 文本
设 结果 = ""
设 i = 1
当 i ≤ 列表长度(列表)
如果 i = 1
设 结果 = 列表第i项(列表)
否则
设 结果 = 结果 & 分隔符 & 列表第i项(列表)
设 i = i + 1
返回 结果
列表最大值/最小值
定义 列表最大值(列表) 返回 最大值
设 最大 = 文本转数字(列表第1项(列表))
设 i = 2
当 i ≤ 列表长度(列表)
设 当前 = 文本转数字(列表第i项(列表))
如果 当前 > 最大
设 最大 = 当前
设 i = i + 1
返回 最大
常见问题
Q1: is in list 区分大小写吗?
是的,is in list 精确匹配,区分大小写。如果需要不区分大小写的查找:
定义 不区分大小写查找(列表, 目标) 返回 是否找到
设 i = 1
当 i ≤ 列表长度(列表)
如果 转小写(列表第i项(列表)) = 转小写(目标)
返回 true
设 i = i + 1
返回 false
Q2: 如何随机打乱列表?
定义 随机打乱(列表) 返回 结果
设 结果 = 复制列表(列表)
设 i = 列表长度(结果)
当 i > 1
设 j = 数学.随机整数(1, i)
设 临时 = 列表第i项(结果)
调用 替换列表项(结果, i, 列表第j项(结果))
调用 替换列表项(结果, j, 临时)
设 i = i - 1
返回 结果
总结
| 操作 | 时间复杂度 | 适用场景 |
|---|---|---|
| 判断重复 | O(n²) 或 O(n) | 数据验证 |
| 去重 | O(n²) | 数据清洗 |
| 排序 | O(n²) | 显示排序 |
| 查找 | O(n) | 搜索功能 |
| 过滤 | O(n) | 数据筛选 |
版权声明:MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权,本文档由 ai2claw 🐝 整理。
扫码添加客服咨询