2015-05-24 4 views
3

У меня есть список значений [1,2,3,4,5,...], я хочу вернуть список всех возможных связанных комбинаций, используя списки, количество или любое другое.python связанные комбинации элементов списка

Подключенный, я имею в виду, что пары элементов в списке должны поддерживать свои смежности в комбинациях (не обязательно, чтобы целые числа со смежными значениями были рядом друг с другом, хотя это было бы нормально).

Чтобы было ясно, вот что я хотел бы вернулся, в случае списка [1,2,3,4,5]:

[[1,2,3,4,5], 
[1,2,3,4], 
[2,3,4,5], 
[1,2,3], 
[2,3,4], 
[3,4,5], 
[1,2], 
[2,3], 
[3,4], 
[4,5], 
[1], 
[2], 
[3], 
[4], 
[5]] 

А вот типы элементов я сделать не хотите:

[[1,2,3,5], 
[1,3,4,5], 
...] 

Я видел много сообщений о получении всей возможной комбинации в общем, но я не видел, чтобы кто-нибудь задавал вопрос о комбинациях с ограничением связности. Есть идеи?

ответ

4

Вот способ со списком понимания:

>>> lst = [6, 7, 8, 9] 
>>> [lst[i:j] for j in range(len(lst)+1) for i in range(j)] 
[[6], [6, 7], [7], [6, 7, 8], [7, 8], [8], [6, 7, 8, 9], [7, 8, 9], [8, 9], [9]] 

Или, если вы цените порядок и если Я думаю, это правильно из вашего примера:

>>> [lst[i:i+leng] for leng in range(len(lst), 0, -1) for i in range(len(lst)-leng+1)] 
[[6, 7, 8, 9], [6, 7, 8], [7, 8, 9], [6, 7], [7, 8], [8, 9], [6], [7], [8], [9]] 

Или с itertools.combinations:

>>> [lst[i:j] for i, j in combinations(range(len(lst)+1), 2)] 
[[6], [6, 7], [6, 7, 8], [6, 7, 8, 9], [7], [7, 8], [7, 8, 9], [8], [8, 9], [9]] 

Или даже без какого-либо списка понимания на всех (но теперь я получаю глупо :-)

>>> list(map(lst.__getitem__, starmap(slice, combinations(range(len(lst)+1), 2)))) 
[[6], [6, 7], [6, 7, 8], [6, 7, 8, 9], [7], [7, 8], [7, 8, 9], [8], [8, 9], [9]] 
+0

вы прибили - спасибо –

1

Уверен, что есть много способов сделать это. Я предлагаю простую функцию, которая не может быть более питоническим решением.

def c_list(A): 
    B = [] 
    for i in range(len(A)): 
     for j in range(len(A) - i): 
      B.append(A[j:j+i+1]) 
    return B 

A = [ 1,2,3,4,5 ] 
B = c_list(A) 
print B 

Эта стратегия может быть использована со списком понимания, если это ваша вещь:

C = [A[j:j+i+1] for i in range(len(A)) for j in range(len(A)-i)] 
3
from itertools import islice 
def adj(l): 
    ln = len(l) 
    yield l 
    for n in range(ln -1, 0, -1): 
     yield from (list(islice(l, i, n + i)) for i in range(ln - n % ln+1)) 


l = [1, 2, 3, 4, 5] 
print(list(adj(l))) 
[[1, 2, 3, 4, 5], [1, 2, 3, 4], [2, 3, 4, 5], [1, 2, 3], [2, 3, 4], [3, 4, 5], [1, 2], [2, 3], [3, 4], [4, 5], [1], [2], [3], [4], [5]] 

Вы можете получить значение в то время, также без необходимости хранить все предметы в памяти:

def adj(l): 
    ln = len(l) 
    yield l 
    for n in range(ln - 1, 0, -1): 
     yield from (islice(l, i, n + i) for i in range(ln - n % ln+1)) 


l = [1, 2, 3, 4, 5] 

for ele in adj(l): 
    print(list(ele)) 

Выход:

[1, 2, 3, 4, 5] 
[1, 2, 3, 4] 
[2, 3, 4, 5] 
[1, 2, 3] 
[2, 3, 4] 
[3, 4, 5] 
[1, 2] 
[2, 3] 
[3, 4] 
[4, 5] 
[1] 
[2] 
[3] 
[4] 
[5] 

Или вызвать функцию на каждом срезе:

for ele in adj(l): 
    print(sum(ele)) 

Выход:

15 
10 
14 
6 
9 
12 
3 
5 
7 
9 
1 
2 
3 
4 
5 
+0

определение функции фл): '?? я думаю, вы имеете в виду 'def f (l):' – Chaker

Смежные вопросы