簡體   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