原标题 | 30 Helpful Python Snippets That You Can Learn in 30 Seconds or Less
作 者 | Fatos Morina
翻 译 | Pita & AI开发者
(注:转载的原文中有些小错误,博主在这里做了更正,如果代码运行仍然出现问题,建议回到出自的Giuhub项目上进行校准)
下面的方法可以检查给定列表中是否有重复的元素。它使用了 set()
属性,该属性将会从列表中删除重复的元素。
def all_unique(lst):
return len(lst) == len(set(lst))
x = [1,1,2,2,3,2,3,4,5,6]
y = [1,2,3,4,5]
all_unique(x) # False
all_unique(y) # True
检测两个字符串是否互为变位词(即互相颠倒字符顺序)
from collections import Counter
def anagram(first, second):
return Counter(first) == Counter(second)
anagram("abcd3", "3acdb") # True
以下代码段可用来检查对象的内存使用情况。
import sys
variable = 30
print(sys.getsizeof(variable)) # 28
以下方法将以字节为单位返回字符串长度。
def byte_size(string):
return(len(string.encode('utf-8')))
byte_size('') # 4
byte_size('Hello World') # 11
以下代码不需要使用循环即可打印某个字符串 n 次。
n = 2;
s = "Programming";
print(s * n); # ProgrammingProgramming
以下代码段使用 title()
方法将字符串内的每个词进行首字母大写。
s = "programming is awesome"
print(s.title()) # Programming Is Awesome
以下方法使用 range()
将列表分块为指定大小的较小列表。
from math import ceil
def chunk(lst, size):
return list(
map(lambda x: lst[x * size:x * size + size],
list(range(0, ceil(len(lst) / size)))
)
)
chunk([1,2,3,4,5],2) # [[1, 2], [3, 4], [5]]
以下方法使用 fliter()
删除列表中的错误值(如:False, None, 0 和“”)
def compact(lst):
return list(filter(bool, lst))
compact([0, 1, False, 2, '', 3, 'a', 's', 34]) #[1, 2, 3, 'a', 's', 34]
以下代码段可以用来转换一个二维数组。
array = [['a', 'b'], ['c', 'd'], ['e', 'f']]
transposed = zip(*array)
print(list(transposed)) # [('a', 'c', 'e'), ('b', 'd', 'f')]
进阶版:
Creates a list of elements, grouped based on the position in the original lists.
Use max
combined with list comprehension
to get the length of the longest list in the arguments. Loop for max_length
times grouping elements. If lengths of lists
vary, use fill_value
(defaults to None
).
def zip(*args, fillvalue=None):
max_length = max([len(lst) for lst in args])
result = []
for i in range(max_length):
result.append([
args[k][i] if i < len(args[k]) else fillvalue for k in range(len(args))
])
return result
zip(['a', 'b'], [1, 2], [True, False]) # [['a', 1, True], ['b', 2, False]]
zip(['a'], [1, 2], [True, False]) # [['a', 1, True], [None, 2, False]]
zip(['a'], [1, 2], [True, False], fill_value = '_') # [['a', 1, True], ['_', 2, False]]
以下代码可以在一行中用各种操作符进行多次比较。
a = 3
print( 2 < a < 8) # True
print(1 == a < 2) # False
以下代码段可将字符串列表转换为单个字符串,列表中的每个元素用逗号分隔。
hobbies = ["basketball", "football", "swimming"]
print("My hobbies are: " + ", ".join(hobbies)) # My hobbies are: basketball, football, swimming
以下方法可计算字符串中元音字母(‘a’, ‘e’, ‘i’, ‘o’, ‘u’)的数目。
import re
def count_vowels(str):
# 注:原文中本段代码有误,这里做了更正(by 假如我年华正好)
return len(re.findall(r'[aeiou]', str, re.IGNORECASE))
count_vowels('foobar') # 3
count_vowels('gym') # 0
以下方法可用于将给定字符串的第一个字母转换为小写。(Decapitalizes the first letter of a string.)
Decapitalize the first letter of the string and then add it with rest of the string. Omit the upper_rest parameter to keep the rest of the string intact, or set it to True to convert to uppercase.
def decapitalize(string, upper_rest=False):
return string[:1].lower() + (string[1:].upper() if upper_rest else string[1:])
decapitalize('FooBar') # 'fooBar'
decapitalize('FooBar', True) # 'fOOBAR'
以下方法使用递归来展开潜在的深度列表。
def spread(arg):
ret = []
for i in arg:
if isinstance(i, list):
ret.extend(i)
else:
ret.append(i)
return ret
def deep_flatten(lst):
result = []
result.extend(
spread(list(map(lambda x: deep_flatten(x) if type(x) == list else x, lst))))
return result
deep_flatten([1, [2], [[3], 4], 5]) # [1,2,3,4,5]
下面的方法在将给定的函数应用于两个列表的每个元素后,返回两个列表之间的差值。
def difference_by(a, b, fn):
_b = set(map(fn, b))
return [item for item in a if fn(item) not in _b]
#example:
from math import floor
difference_by([2.1, 1.2], [2.3, 3.4],floor) # [1.2]
difference_by([{'x': 2 }, {'x': 1 }], [{'x': 1 }],
lambda v : v['x']) #[{'x': 2}]
以下方法可在一行中调用多个函数。
def add(a, b):
return a + b
def subtract(a, b):
return a - b
a, b = 4, 5
print((subtract if a > b else add)(a, b)) # 9
以下方法使用 set() 方法仅包含唯一元素的事实来检查列表是否具有重复值。(与1雷同)
def has_duplicates(lst):
return len(lst) != len(set(lst))
x = [1,2,3,4,5,5]
y = [1,2,3,4,5]
has_duplicates(x) # True
has_duplicates(y) # False
以下方法可用于合并两个词典。
def merge_two_dicts(a, b):
c = a.copy() # make a copy of a
c.update(b) # modify keys and values of a with the ones from b
return c
a = {'x': 1, 'y': 2}
b = {'y': 3, 'z': 4}
print(merge_two_dicts(a, b)) #{'x': 1, 'y': 3, 'z': 4}
在Python 3.5及更高版本中,你还可以执行以下操作:
def merge_dictionaries(a, b):
return {**a, **b}
a = {'x': 1, 'y': 2}
b = {'y': 3, 'z': 4}
print(merge_dictionaries(a, b)) #{'x': 1, 'y': 3, 'z': 4}
以下方法可将两个列表转换成一个词典。
def to_dictionary(keys, values):
return dict(zip(keys, values))
keys = ["a", "b", "c"]
values = [2, 3, 4]
print(to_dictionary(keys, values)) #{'a': 2, 'b': 3, 'c': 4}
以下方法将字典作为输入,然后仅返回该字典中的键。
list = ["a", "b", "c", "d"]
for index, element in enumerate(list):
print("Value", element, "Index ", index, )
#Value a Index 0
#Value b Index 1
#Value c Index 2
#Value d Index 3
以下代码段可用于计算执行特定代码所需的时间。
import time
start_time = time.time()
a = 1
b = 2
c = a + b
print(c) #3
end_time = time.time()
total_time = end_time - start_time
print("Time: ", total_time) #Time: 0.0009965896606445312
你可以将 else
子句作为 try/except
块的一部分,如果没有抛出异常,则执行该子句。
try:
2*3
except TypeError:
print("An exception was raised")
else:
print("Thank God, no exceptions were raised.")
以下方法返回列表中出现的最常见元素。
def most_frequent(list):
return max(set(list), key = list.count)
list = [1,2,1,2,3,2,1,4,2]
most_frequent(list) #2
以下方法可检查给定的字符串是否为回文结构。该方法首先将字符串转换为小写,然后从中删除非字母数字字符。最后,它会将新的字符串与反转版本进行比较。
from re import sub
def palindrome(string):
s = sub('[\W_]', '', string.lower())
return s == s[::-1]
palindrome('taco cat') # True
以下代码段将展示如何编写一个不使用 if-else
条件的简单计算器。
import operator
action = {
"+": operator.add,
"-": operator.sub,
"/": operator.truediv,
"*": operator.mul,
"**": pow
}
print(action['-'](50, 25)) # 25
以下算法通过实现 Fisher-Yates算法 在新列表中进行排序来将列表中的元素顺序随机打乱。
from copy import deepcopy
from random import randint
def shuffle(lst):
temp_lst = deepcopy(lst)
m = len(temp_lst)
while (m):
m -= 1
i = randint(0, m)
temp_lst[m], temp_lst[i] = temp_lst[i], temp_lst[m]
return temp_lst
foo = [1,2,3]
shuffle(foo)
以下方法可使列表扁平化,类似于JavaScript中的 [].concat(…arr)
def spread(arg):
ret = []
for i in arg:
#注意执行本代码的环境中不能有以list命名的变量
if isinstance(i, list):
ret.extend(i)
else:
ret.append(i)
return ret
spread([1,2,3,[4,5,6],[7],8,9]) # [1,2,3,4,5,6,7,8,9]
以下是交换两个变量的快速方法,而且无需使用额外的变量。
def swap(a, b):
return b, a
a, b = -1, 14
swap(a, b) # (14, -1)
通过 Key 取对应的 Value 值,可以通过以下方式设置默认值。如果在字典中没有包含要查找的键的情况下返回默认值。
如果 get()
方法没有设置默认值,那么如果遇到不存在的 Key,则会返回 None。
d = {'a': 1, 'b': 2}
print(d.get('c', 3)) # 3
以上是你在日常工作中可能会发现的有用方法的简短列表。
它主要基于这个GitHub项目(https://github.com/30-seconds/30_seconds_of_knowledge),
你可以在其中找到许多其他有用的代码片段,包括Python及其他编程语言和技术。
作者:Fatos Morina(https://towardsdatascience.com/@FatosMorina)
数据科学家 | 软件工程师 | 作者
个人主页:https://www.fatosmorina.com/
via https://towardsdatascience.com/30-helpful-python-snippets-that-you-can-learn-in-30-seconds-or-less-69bb49204172
Mark 作者主页上其它有意思的文章: