首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从Python中的list生成所有可能的排列对?

如何从Python中的list生成所有可能的排列对?
EN

Stack Overflow用户
提问于 2017-12-07 14:54:43
回答 4查看 334关注 0票数 2

如何从Python中的列表中生成所有可能的对排列?

示例:

代码语言:javascript
运行
复制
input = [3, 8, 2]
output = ['3-8', '3-2', '8-3', '8-2', '2-3', '2-8']
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-12-07 14:57:49

您可以使用itertools.permutations

代码语言:javascript
运行
复制
import itertools
input = [3, 8, 2]
final_list = ["{}-{}".format(*i) for i in itertools.permutations(input, 2)]

输出:

代码语言:javascript
运行
复制
['3-8', '3-2', '8-3', '8-2', '2-3', '2-8']

但是,如果您希望所有操作都达到并包括列表的长度,则可以尝试以下操作:

代码语言:javascript
运行
复制
final_list = list(itertools.chain(*[['-'.join(["{}"]*b).format(*i) for i in itertools.permutations(input, b)] for b in range(2, len(input)+1)]))

输出:

代码语言:javascript
运行
复制
['3-8', '3-2', '8-3', '8-2', '2-3', '2-8', '3-8-2', '3-2-8', '8-3-2', '8-2-3', '2-3-8', '2-8-3']

编辑:用于所有可能的操作数:

代码语言:javascript
运行
复制
import re
def tokenize(s):
   converter = {"-":lambda x, y:x-y, '+':lambda x, y:x+y}
   total = 0
   stack = re.findall('\d+|[\-\+]', s)
   operator = None
   for i in stack:
      if i.isdigit():
         if not operator:
            total += int(i)
         else:
            total = converter[operator](total, int(i))
            operator = None
      else:
          operator = i
   return total

new_list = set(list(itertools.chain(*list(itertools.chain(*[[[''.join([''.join('{}'+i) for i in b]+['{}']).format(*c) for b in itertools.permutations(['-', '+'], len(c)-1)] for c in itertools.permutations(input, x)] for x in range(2, len(input)+1)])))))
final_list = {tokenize(a):a for a in new_list}
new_final_list = [b for a, b in final_list.items()]

输出:

代码语言:javascript
运行
复制
['3-2', '8-3', '8-2', '8-3+2', '8-2+3', '8+2', '8+3', '2-8', '3-8', '3+2-8', '2-3']
票数 4
EN

Stack Overflow用户

发布于 2017-12-07 14:57:50

只需将列表提供给itertools.permutations,并在列表理解中相应地格式化,使用*运算符直接将tuple传递给format

代码语言:javascript
运行
复制
import itertools

result = ["{}-{}".format(*x) for x in itertools.permutations([3, 8, 2],2)]

print(result)

结果:

代码语言:javascript
运行
复制
['3-8', '3-2', '8-3', '8-2', '2-3', '2-8']

另外,请注意,不要使用input作为变量名,因为它会覆盖交互式文本输入函数。

票数 3
EN

Stack Overflow用户

发布于 2017-12-07 15:00:23

使用itertools.permutations

代码语言:javascript
运行
复制
from itertools import permutations

input = [3, 8, 2]
output = map('-'.join, permutations(map(str, input), 2))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47697775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档