字典序的理解以及python实现

     字典序,自己之前并没有很多的了解,最近在做题的时候发现出现的还是挺频繁的,索性今天找出来好好研究学习一下,在这里主要是根据网上的一篇博文来学习的,感觉讲的很容易理解这里就不多说了需要的话可以去看看。

    对于数字1、2、3......n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是 54321。

示例: 1 2 3的全排列如下:

1 2 3 , 1 3 2 , 2 1 3 , 2 3 1 , 3 1 2 , 3 2 1

我们这里是通过字典序法找出来的。

那么什么是字典序法呢?

从上面的全排列也可以看出来了,从左往右依次增大,对这就是字典序法。

上面的博文实现了C语言的字典序方法,在这里给出来python的字典序全排列算法的实现,下面是代码:

#coding:utf8

'''
功能:python实现字典序
'''

import random

def generate_random_numbers(total_num=10, max_num=20):  
    num_list = []  
    for i in range(total_num):
        num_list.append(random.randint(0, max_num))
    return num_list  

def dict_sort(num_list):
    final_list=[]
    num=1
    decrease_list=sorted(num_list, reverse=True)
    increase_list=sorted(num_list)
    for i in range(len(increase_list)):
        num*=increase_list[i]#A(n,n)代表所有元素的全排列数量
    while num:#这里循环产生A(n,n)次
        for i in range(len(num_list)-2,-1,-1):
            if num_list[i]<num_list[i+1]:
                flagi=i
                break
        for j in range(len(num_list)-1,flagi,-1):
            if num_list[j]>num_list[flagi]:
                flagj=j
                break
        # num_list[i], num_list[j]=num_list[j], num_list[i]
        num_list[flagi], num_list[flagj]=num_list[flagj], num_list[flagi]
        num_list2=sorted(num_list[i+1:])
        result_list=num_list[:i+1]+num_list2
        final_list.append(''.join([str(x) for x in result_list]))
        num-=1

    return final_list

if __name__ == '__main__':
    num_list1=[1,2,3]
    num_list2=[1,2,3,4]
    final_list1=dict_sort(num_list1)
    print '**************************num_list1全排列组合为:**************************'
    print final_list1
    print len(final_list1)
    final_list2=dict_sort(num_list2)
    print '**************************num_list2全排列组合为:**************************'
    print final_list2
    print len(final_list2)

其中的随机数生成器最终并没有用到可以删除的,下面是结果:

**************************num_list1全排列组合为:**************************
['132', '123', '312', '213', '321', '231']
6
**************************num_list2全排列组合为:**************************
['1234','1243','1324','3142','3241','3214','1342','1423','1432','2431','3124','3412','3421','2134','2143','4312','4321','2314','2341','2413','4123','4132','4231','4213']
24


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Python 字典是一种无序、可变、可重复的数据类型,用于存储键值对(key-value pairs)。字典中的键必须是不可变类型(如字符串、数字或元组),而值可以是任何类型。 字典的定义方式如下: ``` my_dict = {"key1": "value1", "key2": "value2", "key3": "value3"} ``` 其中,`{}` 表示字典的开始和结束,每个键值对之间用逗号 `,` 分隔,键和值之间用冒号 `:` 分隔。 可以通过键来访问字典中的值,例如: ``` print(my_dict["key2"]) # 输出 "value2" ``` 如果访问不存在的键,则会抛出 `KeyError` 异常。可以使用 `in` 运算符来检查某个键是否存在于字典中,例如: ``` if "key4" in my_dict: print(my_dict["key4"]) else: print("key4 does not exist in the dictionary") ``` 字典提供了一些常用的方法,例如: - `len(my_dict)` 返回字典中键值对的数量。 - `my_dict.keys()` 返回字典中所有键的列表。 - `my_dict.values()` 返回字典中所有值的列表。 - `my_dict.items()` 返回字典中所有键值对的列表,每个键值对由一个元组 `(key, value)` 表示。 可以使用 `for` 循环来遍历字典中的键或键值对,例如: ``` # 遍历键 for key in my_dict: print(key) # 遍历值 for value in my_dict.values(): print(value) # 遍历键值对 for key, value in my_dict.items(): print(key, value) ``` 字典是可变类型,可以动态添加、修改和删除键值对。可以使用如下方法来实现: - `my_dict[key] = value` 添加或修改一个键值对。 - `del my_dict[key]` 删除指定的键值对。 - `my_dict.clear()` 删除字典中的所有键值对。 需要注意的是,字典是无序的,因此不支持使用索引访问。如果需要按照某种顺序遍历字典中的键或键值对,可以使用 `sorted()` 函数对键进行排序,例如: ``` # 按照键的字典序排序 for key in sorted(my_dict): print(key, my_dict[key]) ``` 以上是 Python 字典的基本操作,可以帮助我们更好地理解和使用字典。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Together_CZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值