python打乱list_python一些常用小技巧

最近看到我关注的某公众号,文章是从网上原封不动的抄的,随便一搜,网络上都是那个文章。这个还不是重点,重点是,代码里有很多错误,而且是用截图方式弄的,别人想借鉴,还不能copy. 我重新整理了一下,并且在自己机器上运行通过,也算是自己巩固,然后正本清源吧!

  1. 反转字符串 采用切片操作实现字符串的反转:
# Reversing a string using slicingmy_string = "ABCDE"reversed_string = my_string[::-1]print(reversed_string)​# Output# EDCBA
  1. 实现首字母大写 这个小技巧是让字符串中每个单词的首字母变为大写,通过方法 title() 实现:
my_string = "my name is chaitanya baweja"# using the title() function of string classnew_string = my_string.title()print(new_string)# Output# My Name Is Chaitanya Baweja
  1. 去掉字符串中重复的元素 这个技巧是查找字符串中不重复的元素有哪些,通过集合 set 来实现:
my_string = "aavvccccddddeee"# converting the string to a settemp_set = set(my_string)# stitching set into a string using joinnew_string = ''.join(temp_set)print(new_string)
  1. 打印 n 次字符串或者列表 这个技巧通过乘法即可实现打印多次的操作:
n = 3 # number of repetitionsmy_string = "abcd"my_list = [1,2,3]print(my_string*n)# abcdabcdabcdprint(my_string*n)# [1,2,3,1,2,3,1,2,3]

这个技巧比较有趣的应用是定义一个包含 n 个重复的常数元素的列表,如下所示:

n = 4my_list = [0]*n# [0, 0, 0, 0]
  1. 列表推导式 列表推导式是一种非常优雅的基于其他列表来创建新列表的方法,示例如下所示:
original_list = [1,2,3,4]new_list = [2*x for x in original_list]print(new_list)# [2,4,6,8]
  1. 交换两个变量 Python 中交换两个变量的数值是非常简单的,完全不需要第三个变量作为中间值。示例如下所示:
a = 1b = 2a, b = b, aprint(a) # 2print(b) # 1
  1. 字符串分割为一串子字符串列表 采用 split() 方法可以将字符串分割为一个包含其子字符串的列表,示例如下所示:
string_1 = "My name is Chaitanya Baweja"string_2 = "sample/ string 2"# 默认分割符 ' 'print(string_1.split())# ['My', 'name', 'is', 'Chaitanya', 'Baweja']# 自定义分割符 '/'print(string_2.split('/'))# ['sample', ' string 2']
  1. 合并多个字符串为一个字符串 采用 join() 方法可以将多个字符串合并为一个字符串。这相当于上一条技巧的反向操作。示例如下所示:
list_of_strings = ['My', 'name', 'is', 'Chaitanya', 'Baweja']# Using join with the comma separatorprint(','.join(list_of_strings))# Output# My,name,is,Chaitanya,Baweja
  1. 判断字符串是否回文 通过反转字符串,再和原字符串比较,可以判断是否为回文,示例如下:
my_string = "abcba"if my_string == my_string[::-1]:print("palindrome")else: print("not palindrome")# Output# palindrome
  1. 统计列表元素的个数 有多种方式可以实现这个技巧,但我最喜欢的是采用 Counter 类。

Counter 可以统计给定列表中每个元素的个数,返回一个字典格式。示例如下,其中 most_common()方法可以返回列表中数量最多的元素

# finding frequency of each element in a listfrom collections import Countermy_list = ['a','a','b','b','b','c','d','d','d','d','d']count = Counter(my_list) # defining a counter objectprint(count) # Of all elements# Counter({'d': 5, 'b': 3, 'a': 2, 'c': 1})print(count['b']) # of individual element# 3print(count.most_common(1)) # most frequent element# [('d', 5)]
  1. 判断两个字符串是否是字谜(Anagrams) 字谜(Anagrams)是指将一个单词打乱其字母顺序,重新排列为一个新的单词。

Counter 正好可以用于解决这个问题,因为如果两个字符串的 Counter 对象相等,就表示它们就是字谜,因为包含相同元素且元素数量都相同。

示例如下:

from collections import Counterstr_1, str_2, str_3 = "acbde", "abced", "abcda"cnt_1, cnt_2, cnt_3 = Counter(str_1), Counter(str_2), Counter(str_3)if cnt_1 == cnt_2: print('1 and 2 anagram')if cnt_1 == cnt_3: print('1 and 3 anagram')
  1. 采用 try-except-else 语句 Python 中处理错误异常可以简单采用 try-except 语句,而再添加一个 else 语句会更加有帮助,它是在没有发生异常时,执行完 try 语句后运行的语句。

此外,如果需要运行是否发现异常的都需要执行的代码,可以采用 finally ,示例如下:

a, b = 1,0try: print(a/b) # exception raised when b is 0except ZeroDivisionError: print("division by zero")else:print("no exceptions raised")finally:print("Run this always")
  1. 采用 Enumerate 来获取索引值 在迭代列表的时候,可以采用 enumerate 来得到索引值,示例如下:
my_list = ['a', 'b', 'c', 'd', 'e']for index, value in enumerate(my_list):print('{0}: {1}'.format(index, value))# 0: a# 1: b# 2: c# 3: d# 4: e

注意,这里还可以指定索引开始的范围,只需要在调用 enumerate() 时候,添加一个参数,如下所示:

my_list = ['a', 'b', 'c', 'd', 'e']for index, value in enumerate(my_list, 1):print('{0}: {1}'.format(index, value))
  1. 检查一个对象的内存使用量 可以采用 sys.getsizeof() 检查,示例如下:
import sysnum = 21print(sys.getsizeof(num))# In Python 2, 24# In Python 3, 28
  1. 合并两个字典 在 Python2 版本的时候可以采用 update() 方法实现合并字典的操作,但在 Python3.5 后的版本,可以采用新的方式实现,操作更加简单,如下所示:
dict_1 = {'apple': 9, 'banana': 6}dict_2 = {'banana': 4, 'orange': 8}combined_dict = {**dict_1, **dict_2}print(combined_dict)# Output# {'apple': 9, 'banana': 4, 'orange': 8}
  1. 计算代码执行时间 采用 time 模块来计算一段代码的执行时间,例子如下:
import timestart_time = time.time()# Code to check followsa, b = 1,2c = a+ b# Code to check endsend_time = time.time()time_taken_in_micro = (end_time- start_time)*(10**6)print(" Time taken in micro_seconds: {0} ms").format(time_taken_in_micro)
  1. 展开元素为列表的列表有时候并确定一个列表中的深度有多深,所以你只想简单的将所有元素都放在一个列表中,实现技巧代码如下所示:
from iteration_utilities import deepflatten# 列表只有一层深度的情况,采用这个函数def flatten(l): return [item for sublist in l for item in sublist]l = [[1,2,3],[3]]print(flatten(l))# [1, 2, 3, 3]# 不知道列表的深度的情况l = [[1,2,3],[4,[5],[6,7]],[8,[9,[10]]]]print(list(deepflatten(l, depth=3)))# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  1. 从列表中采样 采用 random 模块可以对一个列表随机采样 n 个元素,示例如下所示:
38e4bbfaa1eaded680213a9b4ffec621.png
import randommy_list = ['a', 'b', 'c', 'd', 'e']num_samples = 2samples = random.sample(my_list,num_samples)print(samples)# [ 'a', 'e'] this will have any 2 random values

另外,在 Python 3 中推荐采用 secrets 模块,基于密码学的目的来随机生成样本,示例如下:

import secrets # imports secure module.secure_random = secrets.SystemRandom() # creates a secure random object.my_list = ['a','b','c','d','e']num_samples = 2samples = secure_random.sample(my_list, num_samples)print(samples)# [ 'e', 'd'] this will have any 2 random values
  1. 数字化 下面是一个例子,将一个数字转换为一个数字列表的形式:
num = 123456list_of_digits = list(map(int, str(num)))print(list_of_digits)# [1, 2, 3, 4, 5, 6]
  1. 检查唯一性 下面的代码是用于判断一个列表的所有元素是否都是唯一没有重复的:
def unique(l): if len(l)==len(set(l)):  print("All elements are unique") else:  print("List has duplicates")unique([1,2,3,4])# All elements are uniqueunique([1,1,2,3])# List has duplicates
  1. 分块

给定具体的大小,定义一个函数以按照这个大小切割列表。

from math import ceildef chunk(lst, size): return list( map(lambda x: lst[x * size:x * size + size], list(range(0, ceil(len(lst) / size)))))print(chunk([1,2,3,4,5],2))# [[1,2],[3,4],5]
  1. 压缩

这个方法可以将布尔型的值去掉,例如(False,None,0,“”),它使用 filter() 函数。

def compact(lst): return list(filter(bool, lst))print(compact([0, 1, False, 2, '', 3, 'a', 's', 34]))# [ 1, 2, 3, 'a', 's', 34 ]
  1. 解包

如下代码段可以将打包好的成对列表解开成两组不同的元组。

array = [['a', 'b'], ['c', 'd'], ['e', 'f']]transposed = list(zip(*array))print(transposed)# [('a', 'c', 'e'), ('b', 'd', 'f')]print(*transposed) # ('a', 'c', 'e') ('b', 'd', 'f')
  1. 逗号连接

下面的代码可以将列`表连接成单个字符串,且每一个元素间的分隔方式设置为了逗号。

hobbies = ["basketball", "football", "swimming"]print("My hobbies are: " + ", ".join(hobbies))# My hobbies are: basketball, football, swimming
  1. 列表的差

该方法将返回第一个列表的元素,其不在第二个列表内。如果同时要反馈第二个列表独有的元素,还需要加一 set_b.difference(set_a).

def difference(a, b):set_a = set(a) set_b = set(b)comparison = set_a.difference(set_b) return list(comparison)print(difference([1,2,3], [1,2,4])) # [3]
  1. 通过函数取差

如下方法首先会应用一个给定的函数,然后再返回应用函数后结果有差别的列表元素。

from math import floordef difference_by(a, b, fn):b = set(map(fn, b)) return [item for item in a if fn(item) not in b]print(difference_by([2.1, 1.2], [2.3, 3.4],floor)) # [1.2]
  1. 获取当前路径下的文件:
import osprint(os.getcwd())my_file = [d for d in os.listdir(".")]print(my_file)
  1. 获取执行文件的文件名和路径:
import os#__file__是当前执行的文件# 获取当前文件__file__的路径print("os.path.realpath(__file__)={}".format(os.path.realpath(__file__)))# 获取当前文件__file__的所在目录print(os.path.dirname(os.path.realpath(__file__)))# 获取当前文件__file__的所在目录print(os.path.split(os.path.realpath(__file__))[0])
  1. 获取某个目录下所有的文件名和目录名:
for d in os.listdir(os.path.split(os.path.realpath(__file__))[0]): print(d)

如果需要深层的,则需要递归了,并且判断 isfile(), isdir()

平时自己不断积累,才会有所收获,看到错误也能立即发现。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值