Python序列:列表list、元组tuple、range

有三种基本序列类型:list, tuple 和 range 对象。

列表是可以修改的,而元组不可以。元组可用作字典键。



序列的通用操作


索引 indexing


索引中所有元素的编号都是从0开始

# 索引
string1='string1'
print(string1[0])

输出结果:s


最后的索引为-1

# 最后一个字符索引为-1
string1='string1'
print(string1[-1])

输出结果:1


切片 slicing


切片来访问特定范围内的元素

切片操作有3个参数,第一索引,第二索引,步长


切片的数学关系:[第一索引,第二索引),第二索引不包含在切片内

# 切片的第一索引=0,第二索引7不包含在内=6,实际显示0-6,也就是[0,7)
string1='string1'
print(len(string1))
print(string1[0:len(string1)])

输出结果:7
输出结果:string1


如果切片开始于序列头,或结束于序列末尾时,可以省略。

# 切片索引的省略
string1='string1'
print(string1[:])                # 头尾省略
print(string1[:len(string1)])    # 头省略
print(string1[0:])               # 尾省略
print(string1[3:5])              # 取[3,5),也就是3、4

显示结果:string1
显示结果:string1
显示结果:string1
显示结果:in


普通切片的步长省略,省略时,步长=1

# 带步长的切片
number=list(range(11))
print(number[0:11:2])
print(number[::2])

显示结果:[0, 2, 4, 6, 8, 10]
显示结果:[0, 2, 4, 6, 8, 10]


步长为负数时,第一个索引必须必第二个索引大

# 步长为负
number=list(range(11))
print(number[11::-2])
print(number[::-2])

显示结果:[10, 8, 6, 4, 2, 0]
显示结果:[10, 8, 6, 4, 2, 0]


赋值用切片是创建副本

# 赋值用切片是创建副本
number=list(range(11))
number1 = number
numberCopy = number[:]
number1[1] = 0
number1[2] = 0
print('number:',number)             # 被number1操作改变
print('number1:',number1)           # 被number1操作改变
print('numberCopy:',numberCopy)     # 不被number1操作改变,number1操作前被切片复制

显示结果:[0, 0, 0, 3, 4, 5, 6, 7, 8, 9, 10]
显示结果:[0, 0, 0, 3, 4, 5, 6, 7, 8, 9, 10]
显示结果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

给切片赋值

# 切片赋值
number = list(range(11))
number[1:3] = [0, 0]
print('number:', number)

显示结果:number: [0, 0, 0, 3, 4, 5, 6, 7, 8, 9, 10]


序列的加法

一般而言,不能拼接不同类型的序列。

# 序列的相加
print([1,2,3]+[4,5,6])
print([1,2,3]+['4','5','6'])
print([1,2,3]+'456')        #错误,list和string不能相加

显示结果:[1, 2, 3, 4, 5, 6]
显示结果:[1, 2, 3, '4', '5', '6']
显示结果:Traceback (most recent call last):  File "E:\PyCode\Python_Study\LsitDemo.py", line 36, in <module>    print([1,2,3]+'456')TypeError: can only concatenate list (not "str") to list


序列的乘法

# 序列的乘法
list1 = [None]*5
print(list1)

显示结果:[None, None, None, None, None]


布尔运算

# 布尔运算
string1='string1'
print('s in string1:','s' in string1)
print('a in string1:','a' in string1)

显示结果:s in string1: True
显示结果:a in string1: False



列表list

列表是可变序列,通常用于存放同类项目的集合(其中精确的相似程度将根据应用而变化)。


class list([iterable])

可以用多种方式构建列表:

  • 使用一对方括号来表示空列表: []

  • 使用方括号,其中的项以逗号分隔: [a][a, b, c]

  • 使用列表推导式: [x for x in iterable]

  • 使用类型的构造器: list() 或 list(iterable)


构造器将构造一个列表,其中的项与 iterable 中的项具有相同的的值与顺序。 iterable 可以是序列、支持迭代的容器或其它可迭代对象。 如果 iterable 已经是一个列表,将创建并返回其副本,类似于 iterable[:]。 例如,list('abc') 返回 ['a', 'b', 'c'] 而 list( (1, 2, 3) ) 返回 [1, 2, 3]。 如果没有给出参数,构造器将创建一个空列表 []


初始化与赋值

# list初始化
list1=[]
for s in 'myStringList':
    list1.append(s)
print('list1:', list1)

list2=[None]*10
print('list2:', list2)

显示结果:list1: ['m', 'y', 'S', 't', 'r', 'i', 'n', 'g', 'L', 'i', 's', 't']
显示结果:list2: [None, None, None, None, None, None, None, None, None, None]


修改和删除list中的元素

# 修改和删除list元素
list1 = []
for s in 'myList1':
    list1.append(s)
print('list1:', list1)

list1[6]='2'
print('修改后list1[6]:', list1)

del list1[6]
print('删除后list1[6]:', list1)

显示结果:list1: ['m', 'y', 'L', 'i', 's', 't', '1']
显示结果:修改后list1[6]: ['m', 'y', 'L', 'i', 's', 't', '2']
显示结果:删除后list1[6]: ['m', 'y', 'L', 'i', 's', 't']


方法:

list

# list函数
string1 = 'string'
list1 = list(string1)       # str转list
print('list1:', list1)

string2=''.join(list1)      # list转str
print('string2:', string2)

显示结果:list1: ['s', 't', 'r', 'i', 'n', 'g']
显示结果:string2: string


append:将一个对象附加到list末尾

string1 = 'string'
list1 = list(string1)       # str转list
print('list1:', list1)

string2=''.join(list1)      # list转str
print('string2:', string2)

显示结果:list1: ['l', 'i', 's', 't', '1']
显示结果:list2: ['l', 'i', 's', 't', '2']
显示结果:list1: ['l', 'i', 's', 't', '1', 'l', 'i', 's', 't', '2']


clear:清空list

string1 = 'list1'
list1 = list(string1)       # str转list
print('list1:', list1)

print('list1.clear():', list1.clear())

显示结果:list1: ['l', 'i', 's', 't', '1']
显示结果:list1.clear(): None


copy:复制list

string1 = 'list1'
list1 = list(string1)       # str转list
print('list1:', list1)

list2 = list1.copy()
print('list2:', list2)

list1[4] = '2'
print('list1:', list1)
print('list2:', list2)      # 改变源列表,不是改变copy复制的列表

显示结果:list1: ['l', 'i', 's', 't', '1']
显示结果:list2: ['l', 'i', 's', 't', '1']
显示结果:list1: ['l', 'i', 's', 't', '2']
显示结果:list2: ['l', 'i', 's', 't', '1']


count:计算指定元素在list中出现的次数

string1 = 'list111'
list1 = list(string1)       # str转list
print("list1.count('1'):", list1.count('1'))

显示结果:list1.count('1'): 3


index:在list中查找指定值第一次出现的索引

list1 = [0, 1, 1, 3, 4, 1]
print("list1.index(1):", list1.index(1))                     # 查找1第一次出现的索引
print("list1.index(1, 2):", list1.index(1, 2))               # 查找从索引2开始1第一次出现的索引
print("list1.index(1, 3, 6):", list1.index(1, 3, 6))         # 查找从索引2开始到索引6,1第一次出现的索引

显示结果:list1.index(1): 1
显示结果:list1.index(1, 2): 2
显示结果:list1.index(1, 3, 6): 5


insert:将一个对象插入到list中

list1 = [10, 12, 14]
list1.insert(1, 11)            # 在索引1处出入11,原索引1的内容往后
print("list1 after list1.insert(1, 11):", list1)
list1.insert(3, 13)             # 在索引3处出入13,原索引3的内容往后
print("list1 after list1.insert(3, 13):", list1)
list1.insert(5, 15)             # 在索引5处出入15,原索引5的内容往后
print("list1 after list1.insert(5, 15):", list1)

显示结果:list1 after list1.insert(1, 11): [10, 11, 12, 14]
显示结果:list1 after list1.insert(3, 13): [10, 11, 12, 13, 14]
显示结果:list1 after list1.insert(5, 15): [10, 11, 12, 13, 14, 15]


pop:从列表中删除一个元素,末尾的元素为最后一个,并返回删除的元素

list1 = [0, 1, 2, 3, 4]
print("list1.pop():", list1.pop())      # 删除并返回末尾的元素
list2 = [0, 1, 2, 3, 4]
print("list2.pop(1):", list2.pop(1))     # 删除并返回索引1的元素
list3 = [0, 1, 2, 3, 4]
print("list3.pop(-1):", list2.pop(-1))  # 删除并返回索引-1的元素,也就是末尾

显示结果:list1.pop(): 4
显示结果:list2.pop(1): 1
显示结果:list3.pop(-1): 4


remove:删除第一个指定值的元素

list1 = [0, 1, 2, 1, 2]
list1.remove(1)     # 删除第一个1,也就是list1[1]
print("list1 after list1.remove(1):", list1)

显示结果:list1 after list1.remove(1): [0, 2, 1, 2]


reverse:反转list

list1 = [0, 1, 2, 3, 4]
list1.reverse()
print("list1 after list1.reverse():", list1)

显示结果:list1 after list1.reverse(): [4, 3, 2, 1, 0]


sort:就地排序list

list1 = [0, 3, 4, 2, 1]
list1.sort()
print("list1 after list1.sort():", list1)

显示结果:list1 after list1.sort(): [0, 1, 2, 3, 4]

list1 = [0, 3, 4, 2, 1]
list1.sort(reverse=True)
print("list1 after list1.sort():", list1)

显示结果:list1 after list1.sort(): [4, 3, 2, 1, 0]

list1 = "This is a test string from Andrew".split()
print("list1 before list1.sort(key=str.lower):", list1)
list1.sort(key=str.lower)
print("list1 after list1.sort(key=str.lower):", list1)

显示结果:list1 before list1.sort(key=str.lower): ['This', 'is', 'a', 'test', 'string', 'from', 'Andrew']
显示结果:list1 after list1.sort(key=str.lower): ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']



元组tuple

元组是不可变序列,通常用于储存异构数据的多项集(例如由 enumerate() 内置函数所产生的二元组)。 元组也被用于需要同构数据的不可变序列的情况(例如允许存储到 set 或 dict 的实例)。


class tuple([iterable])

可以用多种方式构建元组:

  • 使用一对圆括号来表示空元组: ()

  • 使用一个后缀的逗号来表示单元组: a, 或 (a,)

  • 使用以逗号分隔的多个项: a, b, c or (a, b, c)

  • 使用内置的 tuple()tuple() 或 tuple(iterable)


构造器将构造一个元组,其中的项与 iterable 中的项具有相同的值与顺序。 iterable 可以是序列、支持迭代的容器或其他可迭代对象。 如果 iterable 已经是一个元组,会不加改变地将其返回。 例如,tuple('abc') 返回 ('a', 'b', 'c') 而 tuple( [1, 2, 3] ) 返回 (1, 2, 3)。 如果没有给出参数,构造器将创建一个空元组 ()

请注意决定生成元组的其实是逗号而不是圆括号。 圆括号只是可选的,生成空元组或需要避免语法歧义的情况除外。 例如,f(a, b, c) 是在调用函数时附带三个参数,而 f((a, b, c)) 则是在调用函数时附带一个三元组。

元组实现了所有 一般 序列的操作。

对于通过名称访问相比通过索引访问更清晰的异构数据多项集,collections.namedtuple() 可能是比简单元组对象更为合适的选择。


tuple1 = (1, 2, 3)
print('tuple1 is tuple:', type(tuple1) is tuple)

tuple2 = ()
print('tuple2 is tuple:', type(tuple2) is tuple)

tuple3 = (1)
print('tuple3 is tuple:', type(tuple3) is tuple)

tuple4 = (1,)    # 逗号至关重要
print('tuple4 is tuple:', type(tuple4) is tuple)

tuple5 = tuple([1, 2, 3])
print('tuple5 is tuple:', type(tuple5) is tuple)

tuple6 = tuple5[0:2] #元组的切片也是元组
print('tuple6 is tuple:', type(tuple6) is tuple)

显示结果:tuple1 is tuple: True
显示结果:tuple2 is tuple: True
显示结果:tuple3 is tuple: False
显示结果:tuple4 is tuple: True
显示结果:tuple5 is tuple: True
显示结果:tuple6 is tuple: True



Range

range 类型表示不可变的数字序列,通常用于在 for 循环中循环指定的次数。

range 类型相比常规 list 或 tuple 的优势在于一个 range 对象总是占用固定数量的(较小)内存,不论其所表示的范围有多大(因为它只保存了 startstop 和 step 值,并会根据需要计算具体单项或子范围的值)。


class range(stop)

class range(startstop[, step])

range构造函数的参数必须是整数(内置 int 或任何实现 __index__() 特殊方法的对象)。 如果省略 step 参数,则默认为 1。如果省略 start 参数,则默认为 0。如果 step 为零,则引发 ValueError。

如果 step 为正值,确定 range r 内容的公式为 r[i] = start + step*i 其中 i >= 0 且 r[i] < stop

如果 step 为负值,确定 range 内容的公式仍然为 r[i] = start + step*i,但限制条件改为 i >= 0 且 r[i] > stop.

如果 r[0] 不符合值的限制条件,则该 range 对象为空。 range 对象确实支持负索引,但是会将其解读为从正索引所确定的序列的末尾开始索引。

元素绝对值大于 sys.maxsize 的 range 对象是被允许的,但某些特性 (例如 len()) 可能引发 OverflowError


start

start 形参的值 (如果该形参未提供则为 0)

stop

stop 形参的值

step

step 形参的值 (如果该形参未提供则为 1)


r = range(0, 20, 4)
print(list(r))
# output: [0, 4, 8, 12, 16]
print(4 in r)
# output: True
print(5 in r)
# output: False
print(r[2])
# output: 8
print(r[-2])
# output: 12
print(list(r[:2]))
# output: [0, 4]

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个Python的函数,函数名为`extractFlow`。该函数的作用是提取网络流量数据的会话信息,并返回一个会话列表。 具体的实现过程是,传入一个网络流量数据列表`flow_list`,函数遍历该列表中的每一个元素,即每一个网络流量数据,对于每一个流量数据,函数将其拆分成会话信息。拆分的过程中,函数会判断这个流量数据是否属于已有的会话,如果是,则将该流量数据添加到对应的会话中;如果不是,则新建一个会话,并将该流量数据添加到该会话中。最终,函数将所有会话信息存储在一个会话列表`session_list`中,并返回该列表。 需要注意的是,代码中的一部分重复了,也就是前后两段代码是一样的,这可能是代码编写时的疏忽。正确的代码应该是这样的: ``` def extractFlow(flow_list): session_list = [] for idx in range(len(flow_list)): # 提取每个流的五元组和对应的报文长度序列 five_tuple = flow_list[idx][0] length_list = flow_list[idx][1] # 将长度列表转换为长度序列 length_seq = [len_list[i] for i in range(len(len_list))] # 判断该流是否属于已有的会话 is_in_session = False for session_idx in range(len(session_list)): if five_tuple == session_list[session_idx][0]: # 如果已经存在会话,将流添加到会话中 session_list[session_idx][1].append(length_seq) is_in_session = True break if not is_in_session: # 如果不存在会话,新建一个会话并添加流 session_list.append([five_tuple, [length_seq]]) return session_list ``` 该函数实现的主要流程如下: 1. 对于输入的每一个网络流量数据,提取其中的五元组和报文长度序列。 2. 将报文长度序列转换为长度序列。 3. 遍历已有的会话列表,判断该流是否属于已有的会话。如果是,则将该流添加到对应的会话中;如果不是,则新建一个会话并将该流添加到该会话中。 4. 返回所有会话的五元组和报文长度序列

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值