python 常用技巧 — 列表(list)
目录:
1. 嵌套列表对应位置元素相加 (add the corresponding elements of nested list)
2. 多个列表对应位置相加(add the corresponding elements of several lists)
3. 列表中嵌套元组对应位置相加 (python sum corresponding position in list neseted tuple)
4. 判断列表中所有元素是否都是0 (python check if all element in list is zero)
5. 寻找列表中所有最大值的位置 (python find all position of maximum value in list)
6. 计算列表中出现次数最多的所有项 (python get all value with the highest occurrence in list)
7. 生成等间隔列表 (python create list in same space)
8. 寻找嵌套列表的最大值 (python find max value in nested list)
9. 找到列表中的众数 (python find mode in list)
10. 列表按照某个规则排序 (python sort a list according to an regulation)
11. 列表里面元素所有是否满足某一个条件 (python check if all element of a list matches a condition)
12. 对两个列表一起进行排序 (python sort two list in same order)
13. 把嵌套的列表平铺成一个列表 (python convert nested list to a flat list)
内容:
1. 嵌套列表对应位置元素相加 (add the corresponding elements of nested list)
方法1:
>>> lis=[[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]]
>>> [sum(x) for x in zip(*lis)]
[6, 9, 12, 15, 18]
方法2:
>>> seq = np.array([
... [1,2,3,4,5],
... [2,3,4,5,6],
... [3,4,5,6,7]])
>>> np.sum(seq,axis=0)
array([ 6, 9, 12, 15, 18])
2. 多个列表对应位置相加(add the corresponding elements of several lists)
方法1:
a = [1,2,3,4,5]
b = [2,3,4,5,6]
c = [3,4,5,6,7]
[sum(n) for n in zip(*[a, b, c])]
方法2:
>>> seq = np.array([
... [1,2,3,4,5],
... [2,3,4,5,6],
... [3,4,5,6,7]])
>>> np.sum(seq,axis=0)
array([ 6, 9, 12, 15, 18])
3. 列表中嵌套元组对应位置相加 (python sum corresponding position in list neseted tuple)
https://stackoverflow.com/questions/14180866/sum-each-value-in-a-list-of-tuples
方法1:
l = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 0)]
[sum(x) for x in zip(*l)]
[25, 20]
方法2:
map(sum, zip(*l))
[25, 20]
4. 判断列表中所有元素是否都是0 (python check if all element in list is zero)
In [62]: b=[0, 0, 0, 0, 0, 0, 0, 0, 0]
In [63]: all(i==0 for i in b)
Out[63]: True
5. 寻找列表中所有最大值的位置 (python find all position of maximum value in list)
https://stackoverflow.com/questions/3989016/how-to-find-all-positions-of-the-maximum-value-in-a-list
方法1:
a = [32, 37, 28, 30, 37, 25, 27, 24, 35, 55, 23, 31, 55, 21, 40, 18, 50, 35, 41, 49, 37, 19, 40, 41, 31]
>>> m = max(a)
>>> [i for i, j in enumerate(a) if j == m]
[9, 12]
方法2:
m = max(a)
[i for i in range(len(a)) if a[i] == m]
6. 计算列表中出现次数最多的所有项 (python get all value with the highest occurrence in list)
In [10]: from collections import Counter
In [11]: a=[2, 3, 5, 1, 6, 1, 5]
In [12]: ct = Counter(a)
In [13]: ct
Out[13]: Counter({1: 2, 2: 1, 3: 1, 5: 2, 6: 1})
In [14]: max_value = max(ct.values())
In [15]: max_value
Out[15]: 2
In [16]: sorted(key for key, value in ct.items() if value == max_value)
Out[16]: [1, 5]
7. 生成等间隔列表 (python create list in same space)
方法1:
In [3]: [3+x*5 for x in range(10)]
Out[3]: [3, 8, 13, 18, 23, 28, 33, 38, 43, 48]
方法2:
In [46]: import numpy as np
In [47]: np.linspace(0,5,10)
Out[47]:
array([ 0. , 0.55555556, 1.11111111, 1.66666667, 2.22222222,
2.77777778, 3.33333333, 3.88888889, 4.44444444, 5. ])
方法3:
>>> a = np.arange(0,5, 0.5) # returns a numpy array
>>> a
array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5]
8. 寻找嵌套列表的最大值 (python find max value in nested list)
https://stackoverflow.com/questions/33286642/finding-the-largest-number-in-a-nested-list-in-python
In [4]: lists = [[21, 34, 345, 2], [555, 22, 6, 7], [94, 777, 65, 1], [23, 54, 12, 666]]
In [5]: list(map(max, lists))
Out[5]: [345, 555, 777, 666]
In [6]: max(map(max, lists))
Out[6]: 777
9. 找到列表中的众数 (python find mode in list)
https://stackoverflow.com/questions/10797819/finding-the-mode-of-a-list
In [1]: from statistics import mode
In [2]: list = [2,3,4,5,64,3,2,3,3,3]
In [3]: mode(list)
Out[3]: 3
10. 列表按照某个规则排序 (python sort a list according to an regulation)
https://www.geeksforgeeks.org/python-sort-list-according-second-element-sublist/
注意:区分sort和sorted,是否是原地修改列表(in place)
In [58]: a=[('rishav', 10), ('akash', 5), ('ram', 20), ('gaurav', 15)]
In [59]: b=sorted(a, key = lambda x: x[1], reverse=True)
In [60]: a
Out[60]: [('rishav', 10), ('akash', 5), ('ram', 20), ('gaurav', 15)]
In [61]: b
Out[61]: [('ram', 20), ('gaurav', 15), ('rishav', 10), ('akash', 5)]
In [62]: a.sort(key = lambda x: x[1], reverse=True)
In [63]: a
Out[63]: [('ram', 20), ('gaurav', 15), ('rishav', 10), ('akash', 5)]
11. 列表里面元素所有是否满足某一个条件 (python check if all element of a list matches a condition)
>>> items = [[1, 2, 0], [1, 2, 0], [1, 2, 0]]
>>> all(item[2] == 0 for item in items)
True
>>> items = [[1, 2, 0], [1, 2, 1], [1, 2, 0]]
>>> all(item[2] == 0 for item in items)
False
如果想判断至少存在一个这样的元素,则使用下面语句
>>> any(item[2] == 0 for item in items)
True
12. 对两个列表一起进行排序 (python sort two list in same order)
In [197]: a
Out[197]: [(38, 750, 574, 788), (39, 301, 575, 559), (39, 182, 254, 281)]
In [198]: b
Out[198]: [(291, 778), (306, 429), (151, 230)]
In [199]: c, d =zip(*sorted(zip(a, b)))
In [200]: c
Out[200]: ((38, 750, 574, 788), (39, 182, 254, 281), (39, 301, 575, 559))
In [201]: d
Out[201]: ((291, 778), (151, 230), (306, 429))
13. 把嵌套的列表平铺成一个列表 (python convert nested list to a flat list)
https://djangocentral.com/nested-list-to-flat-list/
In [223]: a=[[(86, 68, 414, 99), (309, 132, 435, 144), (94, 185, 410, 230)], [], [], [(1, 2, 3, 4)], []]
// 方法1
In [224]: import functools
...: import operator
...:
In [225]: functools.reduce(operator.concat, a)
Out[225]: [(86, 68, 414, 99), (309, 132, 435, 144), (94, 185, 410, 230), (1, 2, 3, 4)]
// 方法2
In [226]: from functools import reduce
In [227]: reduce(lambda x, y: x+y, a)
Out[227]: [(86, 68, 414, 99), (309, 132, 435, 144), (94, 185, 410, 230), (1, 2, 3, 4)]
// 方法3
In [228]: from itertools import chain
In [229]: list(chain.from_iterable(a))
Out[229]: [(86, 68, 414, 99), (309, 132, 435, 144), (94, 185, 410, 230), (1, 2, 3, 4)]