繁体   English   中英

来自数字变量的排序数字排列列表或没有重复的数字列表

[英]Sorted number permutations list from numeric variables or numeric list with no duplicates

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

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']

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

您已经在使用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']

更新:如果希望避免重复,可以使用set来扩展功能,如Python的itertools.permutations为什么包含重复项中所述。 (当原始列表重复时)

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”之类的示例而言,它是稳定的(保留排列顺序)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM