2015-04-05 6 views
3

Вот мой код в python, который проверяет, находятся ли меньшие подмассивы в большом массиве внутри одного из подмассивов. Я не знаю, который является самым большим индексом sub-array, поэтому я не могу сравнивать его с индексом. Может быть, хорошо разобраться. Но если есть более одного большого подмассива? то есть я хочу, чтобы в окончательном массиве только те большие вложенные массивы, которые содержат меньшие подмассивыКак проверить, является ли массив массив массивным?

[[1, 2, 3], [4, 5, 6], [1, 2, 3, 4, 5, 6], [7,8], [9, 10, 11, 12], [7, 8, 9, 10, 11, 12]]

Во-вторых, то, что я должен делать, если порядок элементов может быть случайным, например: [[1, 3, 2], [4, 5, 6], [1, 2, 3, 4, 5, 6], [7,8], [9, 10, 11, 12], [7, 8, 9, 10, 11, 12]]

Вот мой код:

arr1 = [[1, 2, 3], [4, 5, 6], [1, 2, 3, 4, 5, 6], [7,8], [9, 10, 11, 12], [7, 8, 9, 10, 11, 12]] 

arr2 = [] 
arrInd = 0 
arrInd2 = len(arr1) 
for k in arr1: 
    for n in reversed(arr1): 
     if set(n).issubset(set(k)): 
      arr2.append(k) 

print(arr2) 

Я хотел бы видеть в качестве вывода:

[[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]

Но у меня есть:

[[4, 5, 6], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6], [7, 8], [9, 10, 11, 12], [7, 8, 9, 10, 11, 12], [7, 8, 9, 10, 11, 12], [7, 8, 9, 10, 11, 12]]

UPDATE

Потому что там было так много хороших вопросов, которые я должен добавить еще некоторые детали.

1) Существует множество массивов: arr1 = [[]] 2) он содержит некоторые подмассивы как эти те [1, 2, 3], [4, 5, 6], [4, 6, 5], [7, 8, 9, 10, 11, 12], [11, 12, 13, 14, 15], [1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13, 14, 15], [111, 222, 333], [444, 555], [777, 888], [111, 222, 333, 444, 555], [111, 222, 333, 444, 555, 777, 888], [1000, 2000, 3000] Что такое возможно? 1) Внутри массивов порядок может быть разным: [4, 5, 6], [4, 6, 5] и [1, 2, 3, 4, 5, 6], поэтому он не будет численным, на самом деле в реальных данных (в настоящее время я тестирую) могут быть даже буквы, такие как, B81; 2) Существуют большие и малые массивы, всегда есть самая большая (или несколько), которая никогда не пересекается с другими крупнейшими массивами, поэтому здесь [1, 2, 3, 4, 5, 6] и [7, 8, 9, 10, 11, 12, 13, 14, 15] - они не могут пересекаться друг с другом, но они содержат некоторые мини- массивы; 3) Каждая большая подматрица содержит некоторые более мелкие. Однако не все из них и некоторые небольшие массивы могут существовать независимо. Например: [1, 2, 3, 4, 5, 6] содержит [1, 2, 3], [4, 5, 6], [4, 6, 5], но он не содержит [7, 8, 9, 10, 11, 12], [11, 12, 13, 14, 15] или [111, 222, 333]; 4) Также могут быть промежуточные «большие массивы»: [111, 222, 333, 444, 555] меньше по сравнению с [111, 222, 333, 444, 555, 777, 888], поэтому первый из них [111, 222, 333, 444, 555] должен быть исключен. 5 *) Я хотел бы добавить большие массивы arr2 (окончательный массив) без малого один раз, за ​​исключением случая *** [1000, 2000, 3000] к arr2 (окончательный массив)

Что мой код должен был делать? Он должен был пройти через arr1 и выступают против различных элементов друг с другом для того, чтобы обнаружить, содержит ли п элемента к элементу и наоборот, как она идет от начала до конца for k in arr1: и от конца к началу for n in reversed(arr1):

ОБНОВЛЕНИЕ 2 Сравнение длин!

if len(n) < len(k):

for k in arr1: 
     for n in reversed(arr1): 
      if len(n) < len(k): 
       if set(n).issubset(set(k)): 
        arr2.append(k) 

И это гораздо ближе.На самом деле это почти то, но это делает дубликаты, судя по количеству которых, кажется, что проблема порядка (1) не является проблемой на всех:

arr2 = [[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13, 14, 15], [7, 8, 9, 10, 11, 12, 13, 14, 15], [111, 222, 333, 444, 555], [111, 222, 333, 444, 555], [111, 222, 333, 444, 555, 777, 888], [111, 222, 333, 444, 555, 777, 888], [111, 222, 333, 444, 555, 777, 888], [111, 222, 333, 444, 555, 777, 888]]

Это, конечно, можно начать удаление дубликатов и запустить arr2 таким образом, чтобы избавиться от [111, 222, 333, 444, 555], который фактически является частью [111, 222, 333, 444, 555, 777, 888], но должен быть более элегантный способ.

+3

Непонятно, чего именно вы хотите достичь. –

+0

Я хочу иметь в arr2 только те большие массивы, которые содержат более мелкие –

+0

Я не вижу 'циклов', определенных где угодно. – KSFT

ответ

1

Итак, вы пытаетесь избавиться от всех тех списков, которые содержат только элементы, которые также находятся в другом списке?

def eachMasterList(allLists): 
    allSets = [ set(lst) for lst in allLists ] 
    for lst, s in zip(allLists, allSets): 
    if not any(s is not otherSet and s < otherSet for otherSet in allSets): 
     yield lst 

Чтобы использовать эту функцию, попробуйте следующее:

print(list(eachMasterList([[1, 2, 3], [4, 5, 6], [1, 2, 3, 4, 5, 6], [7,8], [9, 10, 11, 12], [7, 8, 9, 10, 11, 12]]))) 
+0

Это решение удивительно! Для [[1, 2, 3], [4, 5, 6], [4, 6, 5], [7, 8, 9, 10, 11, 12], [11, 12, 13, 14, 15], [1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13, 14, 15], [111, 222, 333], [444, 555] , [777, 888], [111, 222, 333, 444, 555], [111, 222, 333, 444, 555, 777, 888], [1000, 2000, 3000]]. Он дает этот результат: [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13, 14, 15], [111, 222, 333, 444, 555, 777, 888] , [1000, 2000, 3000]] 'вы действительно мастер! Немного стыдно за мои бедные попытки, но теперь вижу, куда идти. –

0

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

>>> l =[(1, 3, 2), (4, 5, 6), (1, 2, 3, 4, 5, 6), (7, 8), (9, 10, 11, 12), (7, 8, 9, 10, 11, 12)] 

>>> def find_max_sub(l): 
... for i,j in enumerate(l): 
...  for t,k in enumerate(l[i+1:],1): 
...    if set(j).intersection(k): 
...     return find_max_sub([set(l.pop(i))|set(l.pop(t))]+l) 
... return l 
... 
>>> find_max_sub(l) 
[(1, 2, 3, 4, 5, 6), (7, 8, 9, 10, 11, 12)] 

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

0

У вас есть большой список списков, и вы хотите посмотреть много списков в нем? Сделайте это так, как будто вы справитесь с поиском любого другого объекта в большой коллекции: храните их (или подходящую версию, если быть точным) в наборе, чтобы обеспечить быстрый поиск.

Списки не могут быть установлены элементы, но вы можете превратить небольшие списки кортежей и хранить эти:

myindex = set(tuple(sm) for sm in big_list) 

Затем, чтобы проверить, если [1, 3, 4] в вашем big_list, вы просто говорите:

if tuple([1, 3, 4]) in myindex: 
    ... 

Если вы хотите совпадать с списками независимо от порядка (так, чтобы [1, 3, 4] считался равным [3, 1, 4]), включите их и в комплекты. Но не регулярные множества (они не могут быть установлены элементы либо), но frozenset:

myindex = myindex = set(frozenset(sm) for sm in big_list) 

Вот об этом.

0

Вы ищете это?

def get_subset_list(): 
    for arr in arrays: 
     others = [x for x in arrays if x != arr] 
     for other in others: 
      for val in arr: 
       if val not in other: 
        break 
      else: 
       break 
     else: 
      yield arr 

import json 
x = get_subset_list() 
print set([json.dumps(y) for y in x]) 
Смежные вопросы