【Python】列表元素排序:itertools.permutations()

发布于:2024-08-12 ⋅ 阅读:(49) ⋅ 点赞:(0)

一、题目

This tool returns successive r length permutations of elements in an iterable.

If r is not specified or is None, then r defaults to the length of the iterable, and all possible full length permutations are generated.

Permutations are printed in a lexicographic sorted order. So, if the input iterable is sorted, the permutation tuples will be produced in a sorted order.

Sample Code

from itertools import permutations

print(permutations(['1', '2', '3']))

print(list(permutations(['1', '2', '3'])))

print(list(permutations(['1', '2', '3'], 2)))

print(list(permutations('abc', 3)))

>>>  <itertools.permutations object at 0x00000201DA6478E0>
>>> [('1', '2', '3'), ('1', '3', '2'), ('2', '1', '3'), ('2', '3', '1'), ('3', '1', '2'), ('3', '2', '1')]
>>> [('1', '2'), ('1', '3'), ('2', '1'), ('2', '3'), ('3', '1'), ('3', '2')]
>>> [('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]

Input Format

A single line containing the space separated string S and the integer value k.

Output Format

Print the permutations of the string S on separate lines.

Sample Input

HACK 2

Sample Output

 AC
AH
AK
CA
CH
CK
HA
HC
HK
KA
KC
KH

二、代码

from itertools import permutations

S, k = input().split()
k = int(k)

perms = list(permutations(S, k))

print(perms)
for perm in sorted(perms):
    print(''.join(perm))
from itertools import permutations

S, k = input().split()
k = int(k)

perms = list(permutations(S, k))

print(sorted(perms))
sorted_perms = sorted(perms, key=lambda p: ''.join(p))
for perm in sorted_perms:
    print(''.join(perm))

三、解读

S, k = input().split()
k = int(k)
  • 读取用户输入的字符串,假设格式为 "string k",其中 "string" 是由空格分隔的字符组成的字符串,k 是一个整数,表示排列的长度。
  • 使用 split() 方法将输入的字符串分割成两部分:字符串 S 和整数 k。
  • 将分割得到的 k 转换为整数类型,因为 split() 方法返回的是字符串。
perms = list(permutations(S, k))
  • 使用 permutations(S, k) 生成字符串 S 的所有长度为 k 的排列。
  • 将生成的排列转换为列表并存储在变量 perms 中。
for perm in sorted(perms):
    print(''.join(perm))
  • 遍历 sorted(perms),即排序后的排列列表。
  • 对于每个排列 perm,使用 ''.join(perm) 将其从元组转换为字符串,并打印。
sorted_perms = sorted(perms, key=lambda p: ''.join(p))
  • 使用 sorted() 函数和一个 lambda 表达式再次对 perms 列表进行排序。
  • sorted():是Python 的内置函数,用于对可迭代对象的元素进行排序,并返回一个新的排好序的列表。
  • key=lambda p: ''.join(p) :定义排序的依据:
    • lambda:匿名函数,用于创建一个简单的函数对象。
    • p:是 lambda 函数的参数,代表列表 perms 中的每个元素,每个元素都是一个排列的元组。
    • ''.join(p):将元组 p 中的字符连接成一个字符串。因为元组中的字符需要按顺序拼接成字符串才能进行比较。
for perm in sorted_perms:
    print(''.join(perm))
  • key=lambda p: ''.join(p) 指定了排序的关键字,使用排列转换为字符串的结果进行排序。
  • 这步操作同样是多余的,因为 permutations() 已经生成了有序的排列。
  • 遍历 sorted_perms,即使用 lambda 表达式排序后的排列列表。
  • 对于每个排列 perm,将其转换为字符串并打印。

四、itertools.permutations() 通常用在什么地方?

itertools.permutations() 函数用于生成输入可迭代对象的所有可能排列。每个排列都是一个元素序列,其中输入序列的元素以不同的顺序出现。

itertools.permutations() 函数在需要探索所有可能的元素排列的场景中非常有用。由于它返回一个迭代器,因此在处理大量数据时也非常高效。需要注意的是,当输入序列较长时,排列的数量会阶乘增长,可能会导致性能问题。在使用时需要考虑输入序列的长度和实际需求。


1、数学和算法问题:

        解决需要找出所有可能元素顺序的问题,例如排列组合问题。

2、密码学:

        生成密码或秘钥的所有可能排序,用于暴力破解或密码分析。

3、数据加密:

        在某些加密技术中,可能需要对数据进行重新排列以增加安全性。

4、机器学习和数据科学:

        在特征工程或模型训练中,尝试不同的特征组合排列。

5、游戏开发:

        用于生成游戏中所有可能的关卡布局或敌人配置。

6、调度和优化问题:

        在解决调度问题时,找出所有可能的任务序列,例如作业调度、课程表安排等。

7、文本处理:

        对文本中的单词或字符进行重新排列,用于生成文本的变体或进行语言模型训练。

8、艺术和设计:

        在艺术作品或设计中生成图案或颜色的所有可能组合。