元组的特殊语法

元组的特殊语法

如果圆括号里的单一对象是元组对象而不是一个简单的表达式,需要对python进行特别说明。如果确实想得到一个元组,只要在这一单个元素之后、关闭圆括号之前加一个逗号就可以了。

1
2
3
4
5
6
>>> x=(40)
>>> x
40
>>> x=(40,)
>>> x
(40,)

转换、方法以及不可变性

元组不提供排序方法,如果想对元组进行排序,通常得先将它转换为列表并使其成为一个可变对象,才能获得使用排序方法调用的权限。或者使用新的sorted的内置方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> T=('cc','aa','dd','bb')
>>> tmp=list(T)
>>> tmp.sort()
>>> tmp
['aa', 'bb', 'cc', 'dd']
>>> T=tuple(tmp)
>>> T
('aa', 'bb', 'cc', 'dd')
>>> T=('cc','aa','dd','bb')
>>> T
('cc', 'aa', 'dd', 'bb')
>>> sorted(T)
['aa', 'bb', 'cc', 'dd']

列表解析

什么是列表解析?

简单来说,列表解析(list comprehension)提供了一种优雅的生成列表的方法,能用一行代码代替十几行代码,而且不损失任何可读性。而且,性能还快很多很多

简单给个例子,如果我们需要0~100所有偶数组成的列表,正常的代码应该是这样的:

1
2
3
4
a=[]
for i in range(101):
if i%2==0:
a.append(i)

用列表解析来做就是这样的:

1
a=[x for x in range(101) if x%2==0]

简单的一行代码代替了4行代码

从上面的例子来看列表解析的语法其实不难,可以分成三个部分来看

  • x:我们需要的列表里面的结果(1st part)
  • for x in range(101):x来源——0~100的数字(2nd part)
  • if x%2==0:x成立的条件,如果不成立就不放在列表里了(3rd part)

获取文本中所有单词的第1个字符

1
2
3
4
text="My house is full of flowers"
first_charts=[]
for word in text.split():
first_charts.append(word[0])

列表解析的代码:

1
first_charts=[word[0] for word in text.split()]

获取两个列表对应位的乘积

来个复杂的,list a=[2,3,4,5]; list b=[3,4,5,6],想要得到a,b对应位的乘积:

1
[i*j for i,j in zip(a,b)]

带if else的列表解析

list a=[‘1’,’2’,’3’,’i’,’8’],现在想将a中所有能转化为数字的字符串转化为数字,不为数字的内容都转换成0,用列表解析可以这样写:

1
2
[int(i) if i.isdigit() else 0 for i in a]
out>>[1,2,3,0,8]

增加一点难度,如果list a=[‘1’,’2’,’3’,4,5,’o’,’6’],如果不能转换成数字则为None,列表解析可以这样写:

1
2
[int(i) if str(i).isdigit() else None for i in a]
out>>[1, 2, 3, 4, 5, None, 6]

获取一个全0列表

1
['ok' for i in range(10)]

略复杂的列表解析,获取列表中嵌套列表的元素,生成一个无嵌套的新列表

这个例子说起来挺拗口,实际上是想从[[1,2],[3,4,5],[6,7],[8]]这种列表中,把嵌套在列表中的元素解出来,得到[1,2,3,4,5,6,7,8],用列表解析可以这样写:

1
2
3
a=[[1,2],[3,4,5],[6,7],[8]]
[x for i in a for x in i]
out>>[1,2,3,4,5,6,7,8]

理解起来略有一点麻烦,for i in a,i为子列表,for x in i,x得到每个子列表中的值。这样的列表解析写法确实很难理解,所以有时候我们不要过分的使用复杂的列表解析。

获取所有可能的组合

1
2
3
4
from itertools import product
x=['a','b','c']
results = ["".join(i) for i in product(x, repeat=3)]
out>>['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']

参考文献

  1. https://www.jianshu.com/p/c635d3c798c2