2010-01-12 11 views
5

Tôi đang cố gắng để hiển thị tất cả các hoán vị có thể của một danh sách các số, ví dụ nếu tôi có 334 Tôi muốn nhận được:Python có được tất cả các hoán vị của số

3 3 4 
3 4 3 
4 3 3 

tôi cần để có thể làm được điều này cho bất kỳ tập hợp các chữ số nào dài tới 12 chữ số.

Tôi chắc chắn nó có thể khá đơn giản bằng cách sử dụng một cái gì đó như itertools.combinations nhưng tôi hoàn toàn không thể có được cú pháp đúng.

TIA Sam

Trả lời

24
>>> lst = [3, 3, 4] 
>>> import itertools 
>>> set(itertools.permutations(lst)) 
{(3, 4, 3), (3, 3, 4), (4, 3, 3)} 
+0

+1, hoán vị riêng biệt của một danh sách. 'set (list())' để giải cứu lần nữa. – Seth

+0

thx hoàn hảo :-) –

2

Bạn muốn hoán vị chứ không phải kết hợp. Xem: How to generate all permutations of a list in Python

>>> from itertools import permutations 
>>> [a for a in permutations([3,3,4])] 
[(3, 3, 4), (3, 4, 3), (3, 3, 4), (3, 4, 3), (4, 3, 3), (4, 3, 3)] 

Lưu ý rằng nó hoán vị hai 3 của (đó là điều đúng đắn về mặt toán học để làm), nhưng không giống như ví dụ của bạn. Điều này sẽ chỉ tạo sự khác biệt nếu có số trùng lặp trong danh sách của bạn.

3

mà không itertools

def permute(LIST): 
    length=len(LIST) 
    if length <= 1: 
     yield LIST 
    else: 
     for n in range(0,length): 
      for end in permute(LIST[:n] + LIST[n+1:]): 
       yield [ LIST[n] ] + end 

for x in permute(["3","3","4"]): 
    print x 

đầu ra

$ ./python.py 
['3', '3', '4'] 
['3', '4', '3'] 
['3', '3', '4'] 
['3', '4', '3'] 
['4', '3', '3'] 
['4', '3', '3'] 
1

Tôi muốn sử dụng python của itertools, nhưng nếu bạn đã phải thực hiện điều này cho mình, đây là mã trả về tất cả các hoán vị của một kích thước quy định cho một danh sách các giá trị.

Ví dụ: values = [1,2,3], size = 2 =>[[3, 2], [2, 3], [2, 1], [3, 1], [1, 3], [1, 2]]

def permutate(values, size): 
    return map(lambda p: [values[i] for i in p], permutate_positions(len(values), size)) 

def permutate_positions(n, size): 
    if (n==1): 
    return [[n]] 

    unique = [] 
    for p in map(lambda perm: perm[:size], [ p[:i-1] + [n-1] + p[i-1:] for p in permutate_positions(n-1, size) for i in range(1, n+1) ]): 
    if p not in unique: 
     unique.append(p) 

    return unique 
+0

Đây là một câu trả lời hay, tôi thích, nhưng nó có thể tốt nếu giá trị hỗ trợ bằng không. Ví dụ: giá trị = [0,1,2] logic này không thành công. :) – Haranadh