【python】list(5.1)

在这里插入图片描述

承接 【python】list(5)

更多连载请查看【python】


最近一次修订时间为 2020-11-04

Don’t say so much!



1 一些例子

列表中出现次数最多的元素

用 max 和 count 结合

a = [1,2,3,4,5,7,1,2,3,4,6,1,2,3,4,6,1,4,5,6,8,9,1,1,1,2,4,5]

# 统计下2出现的次数
print(a.count(2))

# 与max一起使用,找出频数最高的元素
print(max(set(a),key = a.count))

output

4
1

另外一个中方法

a = [1,2,3,4,5,7,1,2,3,4,6,1,2,3,4,6,1,4,5,6,8,9,1,1,1,2,4,5]

from collections import Counter
cnt = Counter(a)
# 输出频数最高的前1项及其频数
print(cnt.most_common(1))
# 输出频数最高的前3项及其频数
print(cnt.most_common(3))
# 输出结果
print(cnt.most_common(1)[0][0])

output

[(1, 7)]
[(1, 7), (4, 5), (2, 4)]
1

获取列表中n个最大或最小的元素

import heapq

scores = [51, 33, 64, 87, 91, 75, 15, 49, 33, 82]

print(heapq.nlargest(1, scores))  # [91]
print(heapq.nsmallest(1, scores))  # [15]

print(heapq.nlargest(3, scores))  # [91, 87, 82]
print(heapq.nsmallest(5, scores))  # [15, 33, 33, 49, 51]

获取列表中的所有中间元素

_, *middle, _ = [1, 2, 3, 4, 5, 6, 7, 8]
print(middle)  # [2, 3, 4, 5, 6, 7]

元素的所有组合方式

from itertools import combinations
teams = ["Packers", "49ers", "Ravens", "Patriots"]
for game in combinations(teams, 3):
    print(game)

output

('Packers', '49ers', 'Ravens')
('Packers', '49ers', 'Patriots')
('Packers', 'Ravens', 'Patriots')
('49ers', 'Ravens', 'Patriots')

列表中最长的字符串

s = ["Hello", "my", "favorite", "baseketball", "star", "is", "Kobe", "Bryant", "!"]
print(max(s,key=len))

output

baseketball

list 去重

Python 列表去重的4种方式及性能对比 学习笔记

from random import randrange
from collections import OrderedDict
import numpy as np
import time

list1 = [randrange(100) for _ in range(1000000)]

# 方法一:新建一个列表,遍历原列表,如果值不在新列表里,便加入到新列表中
def duplicates1(list1):
    unique = []
    for item in list1:
        if item not in unique:
            unique.append(item)
    return unique

# 方法二:新建一个集合,遍历原列表,如果值不在集合里,便加入到新列表中
def duplicates2(list1): 
    unique = set()
    for item in list1:
        if item not in unique:
            unique.add(item)
    return unique

# 方法三:把列表转化为集合,然后再转化回来
def duplicates3(list1): 
    return list(set(list1))

# 方法四:使用 dict.fromkeys() 函数,可以保留原有数组的顺序并去重——Python3.6及以上才支持
def duplicates4(list1):
    return list(dict.fromkeys((list1)))

# 方法五:在Python3.6 以下,其实也存在 fromkeys 函数,只不过它由 collections 库提供
def duplicates5(list1):
    return list(OrderedDict.fromkeys(list1))


time1 = 0
time2 = 0
time3 = 0
time4 = 0
time5 = 0

for _ in range(10):
    start = time.time()

    duplicates1(list1)
    end1 = time.time()
    time1 += (end1-start)

    duplicates2(list1)
    end2 = time.time()
    time2 += (end2-end1)

    duplicates3(list1)
    end3 = time.time()
    time3 += (end3-end2)

    duplicates4(list1)
    end4 = time.time()
    time4 += (end4-end3)

    duplicates5(list1)
    end5 = time.time()
    time5 += (end5-end4)

print(np.array([time1, time2, time3, time4, time5])*1000/10)

output

[932.25343227  41.24481678  10.72115898  32.05580711  43.39983463]

五种方式,跑 10 次取的平均值,结果单位是 ms

可以看到,借助 set 速度有明显提升,如果不考虑顺序的话,先转化为 set 再还原为 list 速度最快!

去重后要保持原列表的速度话,需要借助 fromkeys 创建字典,因为字典的 key 是 Hash 的,这点本质上和 set 一样


补充

在这里插入图片描述

来自 Python 字典(Dictionary) fromkeys()方法

在这里插入图片描述
来自 Python randrange() 函数


倒置列表

法一:用python的 reversed

list1 = [1,2,3,4,5]
for i in reversed(list1):
    print(i,end='')

output 54321

法二:用列表的 reverse

list1 = [1,2,3,4,5]
list1.reverse()
print(list1)

output [5, 4, 3, 2, 1]

法三:用 python的 sorted

print(list1)
list2 = sorted(list1,reverse=True)
print(list2)

output
[1, 2, 3, 4, 5] [5, 4, 3, 2, 1]

法四:用slice的方法

list1 = [1,2,3,4,5]
list1[::-1]

output

[5, 4, 3, 2, 1]

list[:]

list[:] 深层复制

list1 = [1,2,3,4,5]
list2 = list1
list1[0]=0
list2

output

[0, 2, 3, 4, 5]

list1 = [1,2,3,4,5]
list2 = list1[:]
list1[0]=0
list2

output

[1, 2, 3, 4, 5]

string to list

1)一个单词转化为字母列表
法一:

s = 'bryant'
list1 = [i for i in s]
print(type(list1))
print(list1)

output

<class 'list'>
['b', 'r', 'y', 'a', 'n', 't']

法二:

s = 'bryant'
list1 = list(s)
print(type(list1))
print(list1)

output

<class 'list'>
['b', 'r', 'y', 'a', 'n', 't']

2)一句话转化为单词列表
用 split 方法

s = 'bryant is my brother'
list1 = s.split(' ')
print(type(list1))
print(list1)

output

<class 'list'>
['bryant', 'is', 'my', 'brother']

再来个例子

s = '2019-5-16'
list1 = s.split('-')
print(type(list1))
print(list1)

output

<class 'list'>
['2019', '5', '16']

input() 输入映射为整型并转化为列表(刷牛客网上的算法题时比较常用)

nums = list(map(int,input().split(" ")))

3)“列表”变列表

import ast

def string_to_list(string):
    return ast.literal_eval(string)

string = "[1, 2, 3]"
my_list = string_to_list(string)
print(my_list)  # [1, 2, 3]

string = "[[1, 2, 3],[4, 5, 6]]"
my_list = string_to_list(string)
print(my_list)  # [[1, 2, 3], [4, 5, 6]]

生成列表的所有子集

nums = [1,2,3]
subsets = [[]]
for x in nums:
    subsets.extend([subset + [x] for subset in subsets])  # get all subset
print(subsets)

output

[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]

list to string

由字符构成的 list 转成 string

list1 = list("KobeBryant")
print(list1)

# 法一
s1 = ""
for i in list1:
    s1 += i
    
# 法二
s2 = "".join(list1)

print(type(s1),s1)
print(type(s2),s2)

output

['K', 'o', 'b', 'e', 'B', 'r', 'y', 'a', 'n', 't']
<class 'str'> KobeBryant
<class 'str'> KobeBryant

two list to dict

list1 = [1,2,3,4,5]
list2 = [6,7,8,9,10]
print(dict(zip(list1,list2)))

output

{1: 6, 2: 7, 3: 8, 4: 9, 5: 10}

再看一个例子

list1 = [1,1.0,3,4,5]
list2 = [6,7,8,9,10]
print(dict(zip(list1,list2)))

output

{1: 7, 3: 8, 4: 9, 5: 10}

哈哈, 1 和 1.0 一样,这和字典 key 的 hash 映射的模式有关

将嵌套列表合并为一个列表

list1 = [[1,2,3],[4,5,6],[7,8,9]]
print([num for row in list1 for num in row])

output

[1, 2, 3, 4, 5, 6, 7, 8, 9]

或者

import itertools
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = list(itertools.chain.from_iterable(a))
print(b)

output

[1, 2, 3, 4, 5, 6, 7, 8, 9]

list 配合 *

result = [1,2,3,4,5,6]
for *bbox, conf, cls in result:
	print(bbox, conf, cls)
cls = 0
bbox = [1,2,3,4]
print(("%g " *5 + "\n") % (cls, *bbox))  

把一个列表变成不可变列表

my_set = frozenset(['a', 'b', 'c', 'd'])
my_set.add("a")

output

Traceback (most recent call last):
  File "/usercode/file.py", line 3, in <module>
    my_set.add("a")
AttributeError: 'frozenset' object has no attribute 'add'

求矩阵行列的最大值

max_row = [max(x) for x in grid]
max_col = [max(x) for x in zip(*grid)]

list() 和 [] 谁更快

来自 [] 与 list() 哪个快?为什么快?快多少呢?

先看看其 cpu 的流程

from dis import dis
dis("[]")
dis("list()")

output

  1           0 BUILD_LIST               0
              2 RETURN_VALUE
  1           0 LOAD_NAME                0 (list)
              2 CALL_FUNCTION            0
              4 RETURN_VALUE

对于 [],它是 Python 中的一组字面量(literal),像数字之类的字面量一样,表示确切的固定值

而对于 list(),“list”只是一个普通的名称,并不是字面量,也就是说解释器一开始并不认识它。

步骤上 list() 更多

看看执行速度

import timeit
print(timeit.timeit("[]" , number=10**7))
print(timeit.timeit("list()", number=10**7))

output

0.26061376399957226
1.2219047660000797

快很多

开头插入两个元素

a = [1,2,3,4,5]
a[:0]  = [6,7]
print(a)

output

[6, 7, 1, 2, 3, 4, 5]

Note:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值