练习题1

数据类型


  1. 现有字典d={'a':24,'g':52,'i':12,'k':33}请按value值进行排序?
d = {'a': 24, 'g': 52, 'i': 12, 'k': 33}
print(dict(sorted(d.items(), key=lambda x: x[1])))
  1. alist=[{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}] 中按元素的age由大到小排序
alist = [{'name': 'a', 'age': 20}, {'name': 'b', 'age': 30}, {'name': 'c', 'age': 25}]
print(sorted(alist, key=lambda x: x['age'], reverse=True))
  1. 给定两个列表,怎么找出他们相同的元素和不同的元素?
l1 = [1, 4, 5]
l2 = [2, 5, 8]
s1 = set(l1)
s2 = set(l2)
s_same = s1 & s2
s_diff = s1 ^ s2
print(list(s_same), list(s_diff))
  1. 请写出一段python代码实现删除list里面的重复元素?
# 方法1:
l = ['b', 'c', 'd', 'c', 'a', 'a']
l = list(set(l))
print(l)

# 方法2:
l = ['b', 'c', 'd', 'c', 'a', 'a']
l1 = []
for i in l:
    if i not in l1:  # if not i in l1
        l1.append(i)
print(l1)

# 方法3:
l = ['b', 'c', 'd', 'c', 'a', 'a']
l1 = list(set(l))
l1.sort(key=l.index)
print(l1)

# 方法4:
l = ['b', 'c', 'd', 'c', 'a', 'a']
l1 = sorted(set(l), key=l.index)
print(l1)

# 方法5:
l = ['b', 'c', 'd', 'c', 'a', 'a']
d = {}
d1 = d.fromkeys(l)
print(list(d1.keys()))
  1. 读取字符串
# 字符串切片a[start:stop:step]
a = "123"
print(a[:])
print(a[0::1])
print(a[::-1])
  1. 反转一个整数,如-123 --> -321
def reverse(x):
    if -10 < x < 10:
        return x
    str_x = str(x)
    if str_x[0] != "-":
        str_x = str_x[::-1]
        x = int(str_x)
    else:
        str_x = str_x[1:][::-1]
        x = int(str_x)
        x = -x
    return x

if __name__ == '__main__':
    print(reverse(-120))
  1. 将字符串"k:1|k1:2|k2:3|k3:4",处理成字典{k:1,k1:2,...}
def str2dict(str1):
    dict1 = {}
    for iterms in str1.split('|'):
        key, value = iterms.split(':')
        dict1[key] = value
    return dict1
if __name__ == '__main__':
    str1 = "k:1|k1:2|k2:3|k3:4"
    print(str2dict(str1))
# 使用推导式
d = {k: int(v) for t in str1.split("|") for k, v in (t.split(":"),)}
print(d)
  1. 输入是list a,输出是list b,b中元素对应list a偶数位置的偶数
def num_list(a: list):
    b = list()
    for i in enumerate(a):
        if i[0] % 2 == 0 and i[1] % 2 == 0:
            b.append(i[1])
    return b
print(num_list([0, 8, 8, 3, 4, 5, 8, 8, 8, 9, 10]))

# 使用列表生成式
def num_list(num):
    return [i[1] for i in enumerate(num) if i[0] % 2 == 0 and i[1] % 2 == 0]
  1. 给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数,如[1, 20, 23, 4, 8],返回组合最大的整数应为 8423201
class Solution(object):
    def largestNumber(self, nums):
        for i in range(len(nums) - 1):
            for j in range(i + 1, len(nums)):
                if int(str(nums[i])+str(nums[j])) < int(str(nums[j])+str(nums[i])):
                    nums[i], nums[j] = nums[j], nums[i]
        return str(int("".join(["".join(str(i)) for i in nums])))

# leecode 官方解法
class LargerNumKey(str):
    def __lt__(x, y):
        return x+y > y+x
        
class Solution:
    def largestNumber(self, nums):
        largest_num = ''.join(sorted(map(str, nums), key=LargerNumKey))
        return '0' if largest_num[0] == '0' else largest_num
  1. 字符串去重并排序
s = "lsldjsjsldslaadjd"
l = list(set(s))
print("".join(sorted(l)))
  1. 使用lambda函数对list foo=[-5,8,0,4,9,-4,-20,-2,8,2,-4],正数从小到大,负数从大到小,输出为[0,2,4,8,8,9,-2,-4,-4,-5,-20]
# 常规解法
foo = [-5, 8, 0, 4, 9, -4, -20, -2, 8, 2, -4]
a = []
b = []
for i in foo:
    if i >= 0:
        a.append(i)
    else:
        b.append(i)
lst = sorted(a)
lst.extend(sorted(b, reverse=True))
print(lst)

# 使用lambda
print(sorted(foo, key=lambda x: (x < 0, abs(x))))
  1. dict中同样的value的key集合在list里(前提:value可hash),{'a': 1, 'b':2, 'c':1} 输出:{1: ['a', 'c'], 2:['b']}
from collections import defaultdict, ChainMap

d = {'a': 1, 'b': 2, 'c': 1}
default_dict = defaultdict(list)
print(d)
for k, v in d.items():
    default_dict[v].append(k)

print(default_dict)
  1. 判断字典a是否在字典b中如{'a': [1, 2], 'b': 2}{'a': [1, 2], 'b': 2, 'c': 3}
# 如何判断字典a在字典b
a = {'a': [1, 2], 'b': 2}
b = {'a': [1, 2], 'b': 2, 'c': 3}

def is_dict_included(dict1: dict, dict2: dict):
    flag = False
    for key in dict1:
        if key in dict2 and dict1.get(key) == dict2.get(key):
            flag = True
        else:
            flag = False
    return flag

print(is_dict_included(a, b))
  1. 怎样在一个序列上面保持元素顺序的同时消除重复的值?

  1. 统计所有列表中元素的个数
'''
如下
a = ['a', 'b']
b = ['c', 'd']
c = ['a', 'c']
则输出:{'a': 2, 'b': 1, 'c': 2, 'd': 1}
'''

# 方法1:
from collections import Counter
a = ['a', 'b']
b = ['c', 'd']
c = ['a', 'c']

print(dict(Counter(a) + Counter(b) + Counter(c)))

# 方法2:
d = a + b + c
e = {}

for i in set(d):
    e[i] = d.count(i)
print(e)
  1. 实现笛卡尔积
# 如输入[[1,2],[3],[4]]输出134,234
# 方法1:递归生成器
def combi(seq):
    if not seq:
        yield []
    else:
        for element in seq[0]:
            for rest in combi(seq[1:]):
                yield [element] + rest

if __name__ == '__main__':
    n = [[1, 2], [3, 4], [5, 6, 7]]
    rst = []
    for item in combi(n):
        rst.append(''.join([str(i) for i in item]))
    print(rst)

# 方法2: 使用itertools.product
import itertools
n = [[1, 2], [3, 4], [5, 6, 7]]
rst = []
for item in itertools.product(*n):
    rst.append(''.join([str(i) for i in item]))
print(rst)

参考用递归生成器计算笛卡尔积Python 计算笛卡尔积

  1. 列表去重
# 方法1:
l = [2,1,2,3,4,5,6,6,5,4,3,2,1]
result = list(set(l))
print(result)

# 保持原顺序
# 方法2:
result = []
for i in l:
    if i not in result:
        result.append(i)
print(result)

# 方法3:使用字典键的唯一性
print(dict.fromkeys(l).keys())
  1. 列表中相同元素的个数并排序
l = [1, 2, 3, 'a', 'b', 'c', 1, 2, 'a', 'b', 3, 'c', 'd', 'a', 'b', 1]
result = dict([(i, l.count(i)) for i in set(l)])
print(result)
print(dict(sorted(result.items(), key=lambda x: x[1])))
l = [1, 2, 3, 'a', 'b', 'c', 1, 2, 'a', 'b', 3, 'c', 'd', 'a', 'b', 1]
result = [(i, l.count(i)) for i in set(l)]
print(result)
result.sort(key=lambda x: x[1])
print(result)
print(dict(result))
  1. 递归写斐波那契数列
from functools import lru_cache

@lru_cache
def fib(n):
    if n < 2:
        return 1
    return fib(n - 2) + fib(n - 1)

print(fib(100))
  1. 字符串统计
s = 'abcdaacddceea'
print(dict([(i, s.count(i)) for i in set(s)]))
  1. 统计重复最多的前3个字符
from collections import Counter
s = 'abcdaacddceea'
c = Counter(s)
print(c.most_common(3))
  1. 确定字符串是否包含唯一字符
def has_unique_chars(string):
    if not string:
        return False
    return len(set(string)) == len(string)

s1 = 'aabbbc'
s2 = 'abc'
s3 = ''
print(has_unique_chars(s1), has_unique_chars(s2), has_unique_chars(s3))
  1. 确定字符串是否是另一个的排列
def is_permutation(str1, str2):
    if not str1 or not str2:
        return False
    return sorted(str1) == sorted(str2)


s1 = '123'
s2 = '321'
print(is_permutation(s1, s2))
s3 = '1223'
s4 = '123'
print(is_permutation(s3, s4))
s5 = ''
print(is_permutation(s4, s5))