2016-11-08 8 views
0

Предположим, у меня есть список списковвхождение элемента в списке списков

record = [['g1','g2','g3'],['g2','g4'],['g1','g3','g5'],['g2','g3','g5'],['g1','g4']] 

и у меня есть список кортежей

list1 = [('g1','g2'),('g1','g3'),('g1','g4'),('g1','g5'),('g2','g3'),('g2','g4'),('g2','g5'),('g3','g4'),('g3','g5'),('g4','g5')] 

Теперь, сколько раз ('g1','g2') происходит в записи? раствор должен быть 1, потому что ('g1','g2') присутствует только в ['g1','g2','g3']

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

+0

Вас не интересует этот вопрос: http://stackoverflow.com/questions/3847386/testing-if-a-list-contains-another-list-with-python? – pt12lol

+0

Вы что-то пробовали? Даже грубая сила? –

+1

делает заказ вопрос? – Julien

ответ

1

Это не красиво, но это работает:

record = [['g1','g2','g3'],['g2','g4'],['g1','g3','g5'],['g2','g3','g5'],['g1','g4']] 
pattern = [('g1','g2'),('g1','g3'),('g1','g4'),('g1','g5'),('g2','g3'),('g2','g4'),('g2','g5'),('g3','g4'),('g3','g5'),('g4','g5')] 

res = {} 
for p in pattern: 
    res[str(p)] = 0 
    for r in record: 
     if set(p).issubset(set(r)): 
      res[str(p)] += 1 

print(res) 

Edit:
10^6 пункты? (ну это не будет работать тогда ...)

0

Рассмотрите элементы в списке списков, g1, g2, ... как вершины неориентированного графа. Перейдите по списку списков и постройте график. Каждый раз, когда g1 и g2 происходят в том же перечне, увеличьте вес g1 <-> g2 на 1. Затем число, которое вы ищете, - это вес края, инцидентного элементам кортежа.

Это предполагает, что кортежи всегда будут иметь два элемента. Если кортежи имеют произвольный размер, в дополнение к произвольным спискам, то эта проблема сводится к нахождению множественных изоморфизмов подграфов, каждый из которых является NP-полным. См. Следующее: https://stackoverflow.com/a/5279581/1749870

+0

вы можете объяснить второй абзац. Мне непонятно –

+0

Я имел в виду, что этот подход практичен только в том случае, если ваши кортежи имеют длину 2. Это позволит вам напрямую проверять вес ребер. Для больших кортежей вам нужно будет проверить, существует ли весь подграф, сформированный из элементов, в более крупном графике. Из вашего примера, если кортеж в 'list1 'равен' (g1, g2, g3, g5) ', тогда вам нужно будет проверить, что полный подграф, образованный этими 4 узлами, существует в графе, созданном из' record', и если это так, найдите наименьший вес края. Но найти, является ли граф 'G' подграфом другого графа' T', является упомянутой выше проблемой NP-Complete. – TheDarkKnight

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

  • Нет связанных вопросов^_^