列表排序交互方式小结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了列表排序交互方式小结相关的知识,希望对你有一定的参考价值。

参考技术A

列表作为多个同类型信息的集中,其默认的排序通常是列表项加入的时间,以及某个值的升序降序。在某些追求特定展示效果的场景下,也需要主动去设置某些列表项的位置。在最近的工作中跟列表打交道比较多,因此总结了一下几种列表排序的方式,包括:1.拖拽;2.置顶;3.上/下移动;4.编辑序号。

使用方式:对列表中某项或某几项进行置顶操作
方便性:
局限:
使用场景:用于突出众多列表项中的少数几项,从而首先展示重要信息,或快捷进入常用项目。
置顶的特点在于无论列表内容有多少,可以简单地完成对目标内容的操作,适用于对列表中单个或少数几项进行突出。被置顶的项可以取消置顶,取消置顶后按照列表某人排序规则回到其应处的位置。如QQ聊天列表:

新浪微博的置顶可能是是大家更熟悉的例子,这里就不截图了。

拖拽模拟了物理世界,是最自然的方式,显然它有着高效、灵活的优点,但相比其他排序方式它对视觉设计、开发要求要稍高。要实现流畅的拖拽过程,有以下几点值得注意:
1.1、在静态界面或hover时表现出可拖拽性
也就是所谓UI的affordance,让人一看就知道它是可拖拽的:

1.2、在拖拽过程中表现出可拖拽性
在视觉上需要设计拖拽项、原位置空出、新位置预留的样式,触发和完成拖拽的各项数值也需要详细定义。

1.3、列表项越多,拖拽的优势就越不明显
大家可以回想下在ps中手指压着鼠标、眼睛盯着图层名称去拖动图层的经历,真是一大麻烦。而当列表项多到出现了翻页,就更无法直接实现拖拽。此时,需要新开页面进入能实现拖拽的页面,或者干脆就将列表设计为无限列表,像本地文件那样。
由常规页面进排序页面,如豆瓣相册的拖拽排序:

单次点击实现一个单位的上/下移动,操作简单,适用于对列表局部中的项进行排序,常见于文件创建类工具中的内容管理。如Sketch、Axure:

值得注意的是,上/下移动的操作与单个列表项是分开的,而不是像其伴随着单个列表项。我想,其中一个理由是在这种点击一次移动一个位置的场景中,仅仅点击一次很可能达不到目的。如果操作跟随列表项的移动,那么在多次点击时鼠标需要不断点击 - 移动 - 点击 - 移动……在点击区域不大的情况下,操作起来无疑会比较麻烦。另外,在使用这些工具时,虽然有图层面板,但用户的注意力集中在内容而非内容的列表上,用户可以直接在编辑区选中内容进行编辑,而不用在列表选中再操作。

直接编辑数字编号是最精准的排序方式了,当然操作也更复杂。另外,每次对编辑后页面都需要刷新一次(其他排序方式是这样吗?)。它适用于需要对列表整体排序进行把握、可能对每个列表项的排序都有要求的场景。如豆瓣豆列的排序、虾米精选集的排序:

工作量
从交互设计的角度审视了这几种排序方式之后,也需要考虑实现的问题。尤其是在工期紧张人手不够的情况下,设计方案常常会变为“不太好用但至少能用”的效果。于是我去询问了开发同事实现4种方式时工作量上的比较,得知拖拽排序和编辑序号是会工作量更大些,但差别也不是特别大。
刷新机制
另外一个要与开发沟通好的问题是,列表排序更改后页面的刷新机制。像豆列那样每进行一次编辑页面就要全刷一次,无疑会带来糟糕的体验。

列表排序方式的选择,首先需要考虑排序的需求到底是怎样的,再去综合列表项总数、要排序的项目数总、列表项形式等因素。总的来说,拖拽还是可以胜任大多数的排序场景。本文只是做出简单的总结,列表的形式和使用场景千差万别,还是那句话,具体情况具体分析。

python基础小结

计算机基础之编程

  1. 编程语言是人与计算机交流的介质
  2. 编程是通过编程语言编写一大堆文件
  3. 为什么要编程-->奴役计算机,让计算机帮我们干活

计算机组成

  1. CPU
    1. 控制器
    2. 运算器
  2. 内存
  3. 外存
  4. 输入设备
  5. 输出设备
  6. IO设备
  7. 32位和64位
  8. 多核CPU
  9. 应用程序的启动
  10. 机械硬盘工作原理
    1. 机械手臂
    2. 磁道
    3. 扇区
    4. 平均寻道时间
    5. 平均延迟时间
    6. 平均寻找数据时间
  11. 固态硬盘工作原理

计算机操作系统

  1. 什么是文件
  2. 什么是应用程序
  3. 操作系统的作用
  4. 操作系统的启动

编程语言分类

  1. 机器语言
  2. 汇编语言
  3. 高级语言
    1. 编译型
    2. 解释型

网络瓶颈效应

  1. 网络的延迟时间远远大于应用程序的执行时间

python文件执行的两种方式

  1. 交互式
  2. 命令行式(python test.py)

变量

  1. 变量-->描述世间万物变化的状态
  2. 变量的组成
  3. 变量名的命名规范
  4. 变量名的两种定义方式

常量

  1. 常量-->python中约定俗称不变的量,但实际上是可以改变的,常量名全大写

变量内存管理

  1. 引用计数
  2. 垃圾回收机制
  3. 小整数池

定义变量的三种特征

  1. 打印值
  2. 打印内存
  3. 打印数据类型
import numpy as np

arr = np.array([1, 2, 3])
arr
array([1, 2, 3])
type(arr)
numpy.ndarray

花式赋值

  1. 链式赋值
  2. 交叉赋值

注释

  1. 单行注释
  2. 多行注释

与用户交互

  1. input
  2. input接收的值全是字符串

格式化输出的三种方式

  1. %占位符
  2. format格式化
  3. f-string格式化

基本运算符

  1. 算术运算符
  2. 逻辑运算符
  3. 比较运算符
  4. 身份运算符
  5. 赋值运算符
  6. 成员运算符
  7. 运算符的优先级: 优先计算的加括号

流程控制之if判断

  1. 单分支结构
  2. 双分支结构
  3. 多分支结构
  4. if嵌套

流程控制之while循环

  1. while+break
  2. while+continue
  3. while+else
  4. while嵌套

流程控制之for循环

  1. for+break
  2. for+continue
  3. for+else
  4. for嵌套

数字类型

  1. 整型
  2. 浮点型

字符串

# 写代码,有如下变量,请按照要求实现每个功能 (共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. 求出没有同时这两门课程的学员名字集合

布尔

  1. 所有数据类型除了0/None/空/False之外都自带布尔值为True

数据类型分类

可变 不可变
列表/字典/集合 整型/浮点型/字符串/元组
有序 无序
字符串/列表/元组 字典/集合
一个值 多个值
整型/浮点型/字符串 列表/元组/字典/集合

解压缩

  1. 一次性获取多个容器元素

异常处理

try:
    1/0
except Exception as e:
    print(e)
finally:
    print('我一定会执行')
division by zero
我一定会执行
  1. assert 断言
  2. raise 主动抛错

深浅拷贝

  1. 拷贝
  2. 浅拷贝
  3. 深拷贝

字符编码

  1. 用什么编码存就用什么编码取

Pyhton2和3的编码的区别

文件的打开方式

  1. 打开文件 open
  2. 读取文件 read/write
  3. 关闭文件 close

文件的三种打开模式

  1. r
  2. w
  3. a
  4. t:文本
  5. b:二进制

with管理文件上下文

with open('test.py','r',encoding='utf8') as fr:
    ...

文件的高级应用

  1. r+
  2. a+
  3. w+
  4. seek # 移动指针,字节
  5. tell # 告诉指针位置,字节
  6. read(n) # 读取n个字符,只有read模式才是字符
  7. 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 函数名(参数):
    代码块

定义函数的三种方式

  1. 有参函数
  2. 无参函数
  3. 空函数

函数的返回值

  1. return返回值,可以终止函数
  2. 返回多个值,以元组的形式返回
  3. 默认返回None

函数的调用

函数名()

函数的参数

  1. 形参
    1. 位置形参
    2. 默认形参
  2. 实参
    1. 位置实参
    2. 关键字实参

可变长参数

  1. *
    1. *形参
    2. *实参
  2. **
    1. **形参
    2. **实参

函数对象

  1. 引用对象
  2. 函数的返回值
  3. 函数的参数
  4. 容器类元素

函数的嵌套

def f1():
    def f2():
        pass

名称空间和作用域

  1. 内置名称空间
  2. 全局名称空间
  3. 局部名称空间

执行顺序: 内置-->全局-->局部

查找顺序: 从当前位置开始 --> 局部 --> 全局 --> 内置

  1. 全局作用域
  2. 局部作用域

全局作用域和局部作用域互不关联;局部作用域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

迭代器

  1. 可迭代对象
  2. 迭代器对象

生成器

  1. 含有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}]

递归

函数调用函数本身,会有一个结束条件

面向过程编程

流水线编程

模块的四种形式

  1. 自定义
  2. 内置
  3. 第三方

import和from...import

# test.py
import time
  1. 生成一个time的名称空间
  2. 运行time.py文件把生成的变量放入time模块
  3. 让test.py指向time这个名称空间
  4. 生成一个time的名称空间
  5. 运行time.py文件把生成的变量放入time模块
  6. 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

模块的搜索路径

  1. 内存-->内置-->自定制-->环境变量(sys.path)

文件的两种用途

  1. 执行文件
  2. 模块文件

  1. 一个模块里有多个函数,无法管理,所以分成多个文件存放函数,但是不能改变模块的导入方式
  2. 导包就是导init

time模块

  1. 打印三种不同格式的时间

datetime模块

  1. 修改时间

random模块

  1. 随机数+打乱列表顺序

json模块

  1. 序列化: 将python数据类型转化为json串
  2. 反序列化: 将json串转化为python数据类型

特性: 跨平台

pickle模块

  1. 只针对python,但是python的所有数据类型

os模块

  1. 与操作系统交互,多用于文件处理

sys模块

  1. 与python解释器交互

hashlib模块

  1. 加密成固定长度的字符串

hmac模块

  1. 相比较hashlib模块做了一个加盐处理

uuid模块

import uuid

print(uuid.uuid4())  # 做id(唯一标识)用的
2d465e1b-75c0-4a73-b61d-f731a5d56ca3

logging模块

  1. 日志记录

numpy模块

  1. numpy数组(矩阵)的科学运算

pandas模块

  1. 处理文件,多用于excel表格

matplotlib模块

  1. 画图

re模块

  1. 正则表达式,字符串内找特定的字符串

typing模块

  1. 获取一些数据类型,generator

collections模块

  1. 增加一些特殊的数据类型

shutil模块

  1. 文件的解压缩

xml模块

  1. 配置文件

subprocess模块

  1. 替代cmd输入命令

以上是关于列表排序交互方式小结的主要内容,如果未能解决你的问题,请参考以下文章

如何以非交互方式在 Git 中重新排序提交

子报告中的 s-s-rS 2008 交互式排序未按预期工作

python基础小结

四年直播小结

四年直播小结

如何在 SwiftUI 中以交互方式按年份过滤日期列表