zoukankan      html  css  js  c++  java
  • 326 集合 ,数据类型的补充 ,copy , 编码之间的转换

    一、数据类型补充
    1,对于元组:如果只有一个元素,并且没有逗号,此元素是什么数据类型,改表达式就是什么数据类型。
    tu = (1)
    tu1 = (1,)
    print(tu,type(tu))     #1 <class 'int'>
    print(tu1,type(tu1))   #(1,) <class 'tuple'>
    2,对于list,在循环一个列表时,最好不要进行删除的动作(一旦删除,索引会随之改变),
    容易出错。增加同理
    li = [11,11,22,33,44,55]
    将索引为奇数的元素删除。
    del li[1::2]  #最简单的切片删除法,del可以进行切片删除。
    print(li)
    l1
    = [] for i in range(len(li)): #新建一个列表,将不被删除的元素,加入列表中。 if i % 2 == 0: l1.append(li[i]) li = l1 print(li)
    
    
    l1 = []   #通过元素查找序列号,但是在由相同元素存在是会出错。
    for i in li:
    if li.index(i) % 2 == 0:
    l1.append(i)
    li = l1
    print(li)

    for i in range(len(li)): 在循环中删除元素,会导致后面的元素往前排,i会按照未删除前的方式循环,导致报错
    print(li) # [11, 22, 33, 44, 55] [11, 22, 33, 44, 55] [11, 33, 44, 55] [11, 33, 44, 55] [11, 33, 44]
    print(i) # 0 1 2 3 4
    if i % 2 == 1:
    del li[i]
    print(li) # [11, 22, 33, 44, 55] [11, 33, 44, 55] [11, 33, 44, 55] [11, 33, 44] [11, 33, 44]
    print(i) # 0 1 2 3 4
    print(li) # list assignment index out of range
    del li[100] # list assignment index out of range

     3,dict 在循环字典中,不能增加或者删除此字典的键值对。

    
    
    dic = dict.fromkeys('abc','alex')#fromkeys()函数用于创建一个新字典,以序列seq中元素做字典的键
    print(dic)    #{'a': 'alex', 'b': 'alex', 'c': 'alex'}  value为字典所有键对应的初始值。
    dic = dict.fromkeys([1,2,3],[])
    print(dic)    #{1: [], 2: [], 3: []}
    dic[1].append('老男孩')
    print(dic)    # {1: ['老男孩'], 2: ['老男孩'], 3: ['老男孩']}
    

    dic
    = {'k1':'value1','k2':'value2','name':'wusir'}
    将字典中含有k元素的键,对应的键值对删除。
    for i in dic:
    if 'k' in i:
    del dic[i]
    #RuntimeError: dictionary changed size during iteration字典在迭代过程中更改大小

    count = 0
    for i in dic: #此时的 i 是字典的键
    dic[i+str(count)] = dic[i] #给每个键加一个字符串
    count += 1

    l1 = []
    for i in dic:
    if 'k' in i:
    l1.append(i)
    for i in l1:
    del dic[i]
    print(dic)

     

    4、数据转换
    tuple list
    tu = (1,2,3)
    li = list(tu)

    l1 = [1,2,3]
    tu1 = tuple(l1)
    
    
    tuple >> str
    tu = ('wusir','老男孩')
    s = " ".join(tu)

     二、集合

    集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:

      去重,把一个列表变成集合,就自动去重了。

      关系测试,测试两组数据之前的交集、差集、并集等关系。

    1集合的创建,去重

    li = [11,11,22,22,33,33,33,44]
    li = list(set(li))
    print(li) #[33, 11, 44, 22]
    set = {11,22,33,11,22,33,44}
    print(set) #[33, 11, 44, 22]

    2 集合的增(.add()、.update())

    set1 = {'alex','wusir','ritian','egon','barry'}
    set1.add('女神')
    print(set1)   #{'egon', 'wusir', '女神', 'alex', 'barry', 'ritian'}
    set1.update('abc')  #将元素拆分后添加
    set1.update([1,2,3])
    print(set1)   #{'b', 1, 2, 3, 'c', 'egon', 'wusir', '女神', 'a', 'alex', 'barry', 'ritian'}

    3,删

    set1 = {'alex','wusir','ritian','egon','barry'}
    set1.remove('alex')#按元素删除 print(set1) #{'wusir', 'ritian', 'barry', 'egon'} ret = set1.pop() # 随机删除 有返回值 print(ret) #ritian print(set1) #{'alex', 'wusir', 'barry', 'egon'} set1.clear() #清空集合 print(set1) # set() del set1 #删除集合 print(set1) # NameError: name 'set1' is not defined

    4查

    for 循环 打印

    5,集合的其他操作:

      5.1 交集。(&  或者 intersection)

    set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 & set2)  # {4, 5}
    print(set1.intersection(set2))  # {4, 5}

      5.2 并集。(| 或者 union)

    set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 | set2)  # {1, 2, 3, 4, 5, 6, 7}

    print(set2.union(set1)) # {1, 2, 3, 4, 5, 6, 7}

      5.3 差集。(- 或者 difference)

    set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 - set2)  # {1, 2, 3}
    print(set1.difference(set2))  # {1, 2, 3}

       5.4反交集。 (^ 或者 symmetric_difference)

    set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 ^ set2)  # {1, 2, 3, 6, 7, 8}
    print(set1.symmetric_difference(set2))  # {1, 2, 3, 6, 7, 8}

      5.5子集与超集

     
    set1 = {1,2,3}
    set2 = {1,2,3,4,5,6}
    
    print(set1 < set2)
    print(set1.issubset(set2))  # 这两个相同,都是说明set1是set2子集。
    
    print(set2 > set1)
    print(set2.issuperset(set1))  # 这两个相同,都是说明set2是set1超集。
     

    6,frozenset不可变集合,让集合变成不可变类型。

    s = frozenset('barry')
    print(s,type(s))  # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>

    三、深浅copy

    l1 = [1,2,3]
    l2 = l1
    l2.append(111)
    print(l1,l2)     # [1, 2, 3, 111][1, 2, 3, 111]
    print(id(l1))         #6147008
    print(id(l2))         #6147008
    对于赋值运算,指向的是同一个内存地址。字典,列表,集合都一样。

    copy 不是指向一个,在内存中开辟了一个内存空间
    对于浅copy来说,第一层创建的是新的内存地址,
    而从第二层开始,指向的都是同一个内存地址,
    所以,对于第二层以及更深的层数来说,保持一致
    
    
    l1 = [1,2,3]
    l2 = l1.copy()
    l1.append(111)
    print(id(l1),id(l2)) #35441600 35442360
    l1 = [1,2,[1,2,3,[22,33,44]],4]
    l2 = l1.copy()
    l1[2].append(666)
    print(l1) #[1, 2, [1, 2, 3, [22, 33, 44], 666], 4]
    print(l2) #[1, 2, [1, 2, 3, [22, 33, 44], 666], 4]
    print(id(l1))
    print(id(l2))

    deep.copy
    对于深copy来说,两个是完全独立的,
    改变任意一个的任何元素(无论多少层),另一个绝对不改变.
    import copy
    l1 = [1, 2, [1, 2, 3], 4]
    l2 = copy.deepcopy(l1)
    l1[2].append(666)
    print(l1,l2) #[1, 2, [1, 2, 3, 666], 4] [1, 2, [1, 2, 3], 4]
    print(id(l1[2]),id(l2[2])) # 34983528 34983328
     

     四、编码的补充

    s = 'alex'
    s1 = s.encode('utf-8')  # unicode ---> utf-8 编码
    s3 = s1.decode('utf-8')  # utf-8 ---> unicode 解码
    print(s3)
    
    s = 'alex'
    s1 = s.encode('gbk')  # unicode ---> gbk 编码
    s3 = s1.decode('gbk')  # gbk ---> unicode 解码
    print(s3)
    
    gbk ---> utf-8
    s = 'alex'
    s1 = s.encode('gbk')
    print(s1)
    
    s2 = s1.decode('gbk').encode('utf-8')
    print(s2)
    
    s = '老男孩'
    s1 = s.encode('gbk')
    print(s1)
    
    s2 = s1.decode('gbk').encode('utf-8')
    print(s2)
  • 相关阅读:
    07周总结
    06周总结
    05周总结
    04周总结
    03周总结
    02周总结
    python数据特征预处理
    LeetCode Hard: 23. Merge k Sorted Lists
    LeetCode Hard: 4. Median of Two Sorted Arrays
    LeetCode Medium: 49. Group Anagrams
  • 原文地址:https://www.cnblogs.com/Mr-Murray/p/8651745.html
Copyright © 2011-2022 走看看