Найти индексы двумерного списка в Python, которые содержат другой конкретный подсписок - PullRequest
0 голосов
/ 01 июня 2019

Предположим, у меня есть двумерный список в Python (длина каждого списка не одинакова, скажем, в первом списке 3 элемента, а во втором 4 элемента). У меня есть еще один одномерный список с ровно 2 элементами. Мне нужно найти индексы двумерного списка, которые содержат оба элемента одномерного списка (не обязательно быть в последовательности). Я хочу выполнить эту задачу очень эффективно, поскольку она будет частью огромной задачи анализа (особенно без использования циклов).

Например:

2D list: [[4, 0, 2], [0, 3, 2], [3, 0, 4], [5, 3, 4], [3, 5, 6], [8, 1, 2], [7, 3, 6], [1, 7, 6], [8, 7, 1], [2, 3, 7, 8]]

1D list: [3, 4]

output: 2, 3

Не обязательно, чтобы я использовал структуру списка, есть ли какая-либо другая структура в python, чтобы я мог сделать это более эффективно?

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Если вместо этого заданы 1D-список и ваши подсписки, вы можете

list2d = [
    {0, 2, 4}, {0, 2, 3}, {0, 3, 4}, {3, 4, 5}, {3, 5, 6},
    {8, 1, 2}, {3, 6, 7}, {1, 6, 7}, {8, 1, 7}, {8, 2, 3, 7}
]
set1d = {3, 4}

i = 0
res = set()
for s in list2d:
    if set1d <= s:
        res.add(i)
    i += 1

Я бы очень осторожно предположил, что это самый быстрый результат на чистом питоне

1 голос
/ 01 июня 2019

Не уверен насчет эффективности, но это понимание списка, которое дает желаемый результат:

>>> list2d = [[4, 0, 2], [0, 3, 2], [3, 0, 4], [5, 3, 4], [3, 5, 6], [8, 1, 2], [7, 3, 6], [1, 7, 6], [8, 7, 1], [2, 3, 7, 8]]
>>> list1d = [3, 4]
>>> result = [list2d.index(sublist) for sublist in list2d if all(value in sublist for value in list1d)]
>>> result
[2, 3]

Обратите внимание, что списочные вычисления, как правило, работают лучше, чем при использовании операций Python для отображения / фильтрации , по крайней мере, когда задействованы лямбда-функции (что, вероятно, в вашем случае).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...