列表排序交互方式小结
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了列表排序交互方式小结相关的知识,希望对你有一定的参考价值。
参考技术A列表作为多个同类型信息的集中,其默认的排序通常是列表项加入的时间,以及某个值的升序降序。在某些追求特定展示效果的场景下,也需要主动去设置某些列表项的位置。在最近的工作中跟列表打交道比较多,因此总结了一下几种列表排序的方式,包括:1.拖拽;2.置顶;3.上/下移动;4.编辑序号。
使用方式:对列表中某项或某几项进行置顶操作
方便性:
局限:
使用场景:用于突出众多列表项中的少数几项,从而首先展示重要信息,或快捷进入常用项目。
置顶的特点在于无论列表内容有多少,可以简单地完成对目标内容的操作,适用于对列表中单个或少数几项进行突出。被置顶的项可以取消置顶,取消置顶后按照列表某人排序规则回到其应处的位置。如QQ聊天列表:
新浪微博的置顶可能是是大家更熟悉的例子,这里就不截图了。
拖拽模拟了物理世界,是最自然的方式,显然它有着高效、灵活的优点,但相比其他排序方式它对视觉设计、开发要求要稍高。要实现流畅的拖拽过程,有以下几点值得注意:
1.1、在静态界面或hover时表现出可拖拽性
也就是所谓UI的affordance,让人一看就知道它是可拖拽的:
1.2、在拖拽过程中表现出可拖拽性
在视觉上需要设计拖拽项、原位置空出、新位置预留的样式,触发和完成拖拽的各项数值也需要详细定义。
1.3、列表项越多,拖拽的优势就越不明显
大家可以回想下在ps中手指压着鼠标、眼睛盯着图层名称去拖动图层的经历,真是一大麻烦。而当列表项多到出现了翻页,就更无法直接实现拖拽。此时,需要新开页面进入能实现拖拽的页面,或者干脆就将列表设计为无限列表,像本地文件那样。
由常规页面进排序页面,如豆瓣相册的拖拽排序:
单次点击实现一个单位的上/下移动,操作简单,适用于对列表局部中的项进行排序,常见于文件创建类工具中的内容管理。如Sketch、Axure:
值得注意的是,上/下移动的操作与单个列表项是分开的,而不是像其伴随着单个列表项。我想,其中一个理由是在这种点击一次移动一个位置的场景中,仅仅点击一次很可能达不到目的。如果操作跟随列表项的移动,那么在多次点击时鼠标需要不断点击 - 移动 - 点击 - 移动……在点击区域不大的情况下,操作起来无疑会比较麻烦。另外,在使用这些工具时,虽然有图层面板,但用户的注意力集中在内容而非内容的列表上,用户可以直接在编辑区选中内容进行编辑,而不用在列表选中再操作。
直接编辑数字编号是最精准的排序方式了,当然操作也更复杂。另外,每次对编辑后页面都需要刷新一次(其他排序方式是这样吗?)。它适用于需要对列表整体排序进行把握、可能对每个列表项的排序都有要求的场景。如豆瓣豆列的排序、虾米精选集的排序:
工作量
从交互设计的角度审视了这几种排序方式之后,也需要考虑实现的问题。尤其是在工期紧张人手不够的情况下,设计方案常常会变为“不太好用但至少能用”的效果。于是我去询问了开发同事实现4种方式时工作量上的比较,得知拖拽排序和编辑序号是会工作量更大些,但差别也不是特别大。
刷新机制
另外一个要与开发沟通好的问题是,列表排序更改后页面的刷新机制。像豆列那样每进行一次编辑页面就要全刷一次,无疑会带来糟糕的体验。
列表排序方式的选择,首先需要考虑排序的需求到底是怎样的,再去综合列表项总数、要排序的项目数总、列表项形式等因素。总的来说,拖拽还是可以胜任大多数的排序场景。本文只是做出简单的总结,列表的形式和使用场景千差万别,还是那句话,具体情况具体分析。
python基础小结
目录
- 计算机基础之编程
- 计算机组成
- 计算机操作系统
- 编程语言分类
- 网络瓶颈效应
- python文件执行的两种方式
- 变量
- 常量
- 变量内存管理
- 定义变量的三种特征
- 花式赋值
- 注释
- 与用户交互
- 格式化输出的三种方式
- 基本运算符
- 流程控制之if判断
- 流程控制之while循环
- 流程控制之for循环
- 数字类型
- 字符串
- 列表
- 字典
- 元组
- 集合
- 布尔
- 数据类型分类
- 解压缩
- 异常处理
- 深浅拷贝
- 字符编码
- Pyhton2和3的编码的区别
- 文件的打开方式
- 文件的三种打开模式
- with管理文件上下文
- 文件的高级应用
- 文件的两种修改方式
- 函数的定义
- 定义函数的三种方式
- 函数的返回值
- 函数的调用
- 函数的参数
- 可变长参数
- 函数对象
- 函数的嵌套
- 名称空间和作用域
- 闭包函数
- 装饰器
- 迭代器
- 生成器
- 三元表达式
- 列表推导式
- 字典生成式
- 生成器表达式
- 内置函数
- 匿名函数
- 递归
- 面向过程编程
- 模块的四种形式
- import和from...import
- 循环导入问题
- 模块的搜索路径
- 文件的两种用途
- 包
- time模块
- datetime模块
- random模块
- json模块
- pickle模块
- os模块
- sys模块
- hashlib模块
- hmac模块
- uuid模块
- logging模块
- numpy模块
- pandas模块
- matplotlib模块
- re模块
- typing模块
- collections模块
- shutil模块
- xml模块
- subprocess模块
计算机基础之编程
- 编程语言是人与计算机交流的介质
- 编程是通过编程语言编写一大堆文件
- 为什么要编程-->奴役计算机,让计算机帮我们干活
计算机组成
- CPU
- 控制器
- 运算器
- 内存
- 外存
- 输入设备
- 输出设备
- IO设备
- 32位和64位
- 多核CPU
- 应用程序的启动
- 机械硬盘工作原理
- 机械手臂
- 磁道
- 扇区
- 平均寻道时间
- 平均延迟时间
- 平均寻找数据时间
- 固态硬盘工作原理
计算机操作系统
- 什么是文件
- 什么是应用程序
- 操作系统的作用
- 操作系统的启动
编程语言分类
- 机器语言
- 汇编语言
- 高级语言
- 编译型
- 解释型
网络瓶颈效应
- 网络的延迟时间远远大于应用程序的执行时间
python文件执行的两种方式
- 交互式
- 命令行式(python test.py)
变量
- 变量-->描述世间万物变化的状态
- 变量的组成
- 变量名的命名规范
- 变量名的两种定义方式
常量
- 常量-->python中约定俗称不变的量,但实际上是可以改变的,常量名全大写
变量内存管理
- 引用计数
- 垃圾回收机制
- 小整数池
定义变量的三种特征
- 打印值
- 打印内存
- 打印数据类型
import numpy as np
arr = np.array([1, 2, 3])
arr
array([1, 2, 3])
type(arr)
numpy.ndarray
花式赋值
- 链式赋值
- 交叉赋值
注释
- 单行注释
- 多行注释
与用户交互
- input
- input接收的值全是字符串
格式化输出的三种方式
- %占位符
- format格式化
- f-string格式化
基本运算符
- 算术运算符
- 逻辑运算符
- 比较运算符
- 身份运算符
- 赋值运算符
- 成员运算符
- 运算符的优先级: 优先计算的加括号
流程控制之if判断
- 单分支结构
- 双分支结构
- 多分支结构
- if嵌套
流程控制之while循环
- while+break
- while+continue
- while+else
- while嵌套
流程控制之for循环
- for+break
- for+continue
- for+else
- for嵌套
数字类型
- 整型
- 浮点型
字符串
# 写代码,有如下变量,请按照要求实现每个功能 (共6分,每小题各0.5分)
name = " aleX"
# 1) 移除 name 变量对应的值两边的空格,并输出处理结果
# 2) 判断 name 变量对应的值是否以 "al" 开头,并输出结果?
# 3) 判断 name 变量对应的值是否以 "X" 结尾,并输出结果?
# 4) 将 name 变量对应的值中的 “l” 替换为 “p”,并输出结果
# 5) 将 name 变量对应的值根据 “l” 分割,并输出结果。
# 6) 将 name 变量对应的值变大写,并输出结果?
# 7) 将 name 变量对应的值变小写,并输出结果?
# 8) 请输出 name 变量对应的值的第 2 个字符?
# 9) 请输出 name 变量对应的值的前 3 个字符?
# 10) 请输出 name 变量对应的值的后 2 个字符??
# 11) 请输出 name 变量对应的值中 “e” 所在索引位置??
# 12) 获取子序列,去掉最后一个字符。如: oldboy 则获取 oldbo。
列表
有如下列表,请按照年龄排序(涉及到匿名函数)
l=[
{'name':'alex','age':84},
{'name':'oldboy','age':73},
{'name':'egon','age':18},
]
字典
1 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中
即: {'k1': 大于66的所有值, 'k2': 小于66的所有值}
元组
九九乘法表
集合
一.关系运算
有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
linuxs={'wupeiqi','oldboy','gangdan'}
1. 求出即报名python又报名linux课程的学员名字集合
2. 求出所有报名的学生名字集合
3. 求出只报名python课程的学员名字
4. 求出没有同时这两门课程的学员名字集合
布尔
- 所有数据类型除了0/None/空/False之外都自带布尔值为True
数据类型分类
可变 | 不可变 |
---|---|
列表/字典/集合 | 整型/浮点型/字符串/元组 |
有序 | 无序 |
---|---|
字符串/列表/元组 | 字典/集合 |
一个值 | 多个值 |
---|---|
整型/浮点型/字符串 | 列表/元组/字典/集合 |
解压缩
- 一次性获取多个容器元素
异常处理
try:
1/0
except Exception as e:
print(e)
finally:
print('我一定会执行')
division by zero
我一定会执行
- assert 断言
- raise 主动抛错
深浅拷贝
- 拷贝
- 浅拷贝
- 深拷贝
字符编码
- 用什么编码存就用什么编码取
Pyhton2和3的编码的区别
文件的打开方式
- 打开文件 open
- 读取文件 read/write
- 关闭文件 close
文件的三种打开模式
- r
- w
- a
- t:文本
- b:二进制
with管理文件上下文
with open('test.py','r',encoding='utf8') as fr:
...
文件的高级应用
- r+
- a+
- w+
- seek # 移动指针,字节
- tell # 告诉指针位置,字节
- read(n) # 读取n个字符,只有read模式才是字符
- truncate() # 截断-->写模式,字节
文件的两种修改方式
with open('test.txt', 'r', encoding='utf8') as fr, open('test_swap.txt', 'w', encoding='utf8') as fw:
data = fr.read()
# 逻辑操作
fw.write(data)
import os
os.remove('test.txt')
os.rename('test_swap.txt', 'test.txt')
函数的定义
def 函数名(参数):
代码块
定义函数的三种方式
- 有参函数
- 无参函数
- 空函数
函数的返回值
- return返回值,可以终止函数
- 返回多个值,以元组的形式返回
- 默认返回None
函数的调用
函数名()
函数的参数
- 形参
- 位置形参
- 默认形参
- 实参
- 位置实参
- 关键字实参
可变长参数
- *
- *形参
- *实参
- **
- **形参
- **实参
函数对象
- 引用对象
- 函数的返回值
- 函数的参数
- 容器类元素
函数的嵌套
def f1():
def f2():
pass
名称空间和作用域
- 内置名称空间
- 全局名称空间
- 局部名称空间
执行顺序: 内置-->全局-->局部
查找顺序: 从当前位置开始 --> 局部 --> 全局 --> 内置
- 全局作用域
- 局部作用域
全局作用域和局部作用域互不关联;局部作用域1和局部作用域2互不关联.
闭包函数
把变量x和函数f2包在一起,通过函数f1返回出来
def f1(x):
def f2():
print(x)
return f2
f1(20)
x = 10
装饰器
def outter(func):
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
return res
return wrapper
def sanceng():
def outter(func):
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
return res
return wrapper
return outter
迭代器
- 可迭代对象
- 迭代器对象
生成器
- 含有yield关键字的函数, 函数调用已经不是调用,而是变成一个生成器
def func():
yield 1
g = func() # 生成器
for i in g:
print(i)
1
三元表达式
print(1) if x > 10 else print(2)
列表推导式
[i for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
字典生成式
{k: v for k, v in {'a': 1}.items()}
{'a': 1}
for i in zip([1, 2, 3], [1, 2, 3]):
print(i)
(1, 1)
(2, 2)
(3, 3)
生成器表达式
(i for i in range(10))
<generator object <genexpr> at 0x00000222B9D67888>
for i in (i for i in range(10)):
print(i)
0
1
2
3
4
5
6
7
8
9
内置函数
for i in enumerate([1, 2, 3]):
print(i)
(0, 1)
(1, 2)
(2, 3)
匿名函数
def f(x, y): return x+y
f(1, 2)
3
匿名函数一般与map/filter/max/min/sorted联用
l = [
{'name': 'alex', 'age': 84},
{'name': 'oldboy', 'age': 73},
{'name': 'egon', 'age': 18},
]
l.sort(key=lambda i: i['age'])
l
[{'name': 'egon', 'age': 18},
{'name': 'oldboy', 'age': 73},
{'name': 'alex', 'age': 84}]
递归
函数调用函数本身,会有一个结束条件
面向过程编程
流水线编程
模块的四种形式
- 自定义
- 内置
- 第三方
- 包
import和from...import
# test.py
import time
- 生成一个time的名称空间
- 运行time.py文件把生成的变量放入time模块
- 让test.py指向time这个名称空间
- 生成一个time的名称空间
- 运行time.py文件把生成的变量放入time模块
- from time import time让test.py指向time
循环导入问题
# m1.py
from m2 import y
x = 10
# m2.py
from m1 import x
y = 20
# m1.py
def f1():
from m2 import y
x = 10
# m2.py
def f1();
from m1 import x
y = 20
模块的搜索路径
- 内存-->内置-->自定制-->环境变量(sys.path)
文件的两种用途
- 执行文件
- 模块文件
包
- 一个模块里有多个函数,无法管理,所以分成多个文件存放函数,但是不能改变模块的导入方式
- 导包就是导init
time模块
- 打印三种不同格式的时间
datetime模块
- 修改时间
random模块
- 随机数+打乱列表顺序
json模块
- 序列化: 将python数据类型转化为json串
- 反序列化: 将json串转化为python数据类型
特性: 跨平台
pickle模块
- 只针对python,但是python的所有数据类型
os模块
- 与操作系统交互,多用于文件处理
sys模块
- 与python解释器交互
hashlib模块
- 加密成固定长度的字符串
hmac模块
- 相比较hashlib模块做了一个加盐处理
uuid模块
import uuid
print(uuid.uuid4()) # 做id(唯一标识)用的
2d465e1b-75c0-4a73-b61d-f731a5d56ca3
logging模块
- 日志记录
numpy模块
- numpy数组(矩阵)的科学运算
pandas模块
- 处理文件,多用于excel表格
matplotlib模块
- 画图
re模块
- 正则表达式,字符串内找特定的字符串
typing模块
- 获取一些数据类型,generator
collections模块
- 增加一些特殊的数据类型
shutil模块
- 文件的解压缩
xml模块
- 配置文件
subprocess模块
- 替代cmd输入命令
以上是关于列表排序交互方式小结的主要内容,如果未能解决你的问题,请参考以下文章