从数字变量或数字列表中排序的数字排列列表,没有重复项

时间:2015-12-04 22:03:12

标签: python python-3.x

数字排列功能,创建所有可能安排的列表。 在这段代码上工作了一段时间,它运作良好,我试图找到一种更短,更有效的编写方式。

a = [3,7,9]
perms = lambda a:list(sorted(z) for z in map(lambda p:dict.fromkeys([str(sum(v* (10**(len(p) -1 - i)) for i,v in enumerate(item))).zfill(len(a)) for item in itertools.permutations(p)]).keys(), [[int(x) for x in ''.join(str(i) for i in a)]]))[0]

代码返回:

['379', '397', '739', '793', '937', '973']

您还可以输入数字字符串变量

a = '468'
perms(a)
['468', '486', '648', '684', '846', '864']

这是代码不同,而不是返回元组或列表。它以字符串格式返回结果列表。此外,您可以输入数字字符串,元组或列表。相信我在发布之前已经检查了任何重复项。

三位数工作得很好

perms('000')
['000']

其他代码生成此

['000', '000', '000', '000', '000', '000']

此外,此代码返回一个有序列表。

1 个答案:

答案 0 :(得分:1)

您已经在使用itertools.permutations,为什么不只是:

def perms(iterable):
    return [''.join(p) for p in (map(str, perm) for perm in itertools.permutations(iterable))]

>>> perms('123')
# Result: ['123', '132', '213', '231', '312', '321']

更新:如果您希望避免重复,可以使用集合扩展功能,如Why does Python's itertools.permutations contain duplicates? (When the original list has duplicates)

中详细说明的那样
def unique_perms(iterable):
    perm_set = set()
    permutations = [i for i in itertools.permutations(iterable) if i not in perm_set and not perm_set.add(i)]
    return [''.join(p) for p in (map(str, perm) for perm in permutations)]

这仍然比海报原始方法快得多,特别是像'000'这样的例子并且是稳定的(保留排列顺序)。