[英]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.