Самый эффективный способ поиска списка списков Python по нескольким полям?

#python #list #sublist

#python #Список #подсписок

Вопрос:

У меня есть структура данных, которая представляет собой список списков. Каждый из подсписков содержит 2 строки и словарь, поэтому в целом структура выглядит следующим образом:

 [
  [ 'A', 'A1', { .... }],
  [ 'A', 'A2', { .... }],
  [ 'B'. 'B1', { .... }],
....
]
  

Что я хочу иметь возможность сделать, так это найти все вложенные списки, где оба первых двух значения соответствуют некоторым критериям — например, где первое значение равно ‘B’, а второе — ‘B1’; если бы это была таблица базы данных, эквивалентом было бы что-то вроде

 Select * from whatever where column1 = 'B' and column2 = 'B1'
  

Может быть несколько совпадений с этим запросом

Какой лучший / наиболее питонический способ сделать это?

Комментарии:

1. Я думаю, что здесь лучше всего просто переработать, чтобы использовать список вложенных словарей

2. Должен ли ваш вывод быть списком, подобным вашему вводу, только отфильтрованным?

3. Вы должны выполнить линейный поиск

4. @Peter_Danneman: Изначально у меня была структура в виде словаря с ключом кортежа из двух столбцов, но это сделало его действительно громоздким для дальнейшей работы в коде

5. @DocDriven — да — в большинстве случаев я ожидаю результатов 0 или 1. Это дерьмовая вещь, которую приходится делать, поскольку скорость тестирования будет экспоненциально ухудшаться по мере роста внешнего списка, но во внешнем списке никогда не будет больше 1000-1500 записей

Ответ №1:

Вы могли бы использовать понимание списка:

 arr = [
  [ 'A', 'A1', { "1" }],
  [ 'A', 'A2', { "2" }],
  [ 'B', 'B1', { "3" }],
]

matches = [sublist for sublist in arr if sublist[0] == 'B' and sublist[1] == 'B1']

for match in matches:
  print(match)
  

Ответ №2:

Здесь сработало бы понимание списка:

 filtered = [mylist for mylist in mainlist if mainlist[0] == 'B' and mainlist[1] == 'B1']
  

Затем вы можете использовать для каждого цикла, чтобы распечатать значения filtered .

Ответ №3:

Попробуйте:

 my_list = [
              [ 'A', 'A1', { .... }],
              [ 'A', 'A2', { .... }],
              [ 'B'. 'B1', { .... }],
              ....
          ]

results = []

for item in my_list:
    if item[0] == <criteria1> and item[1] == <criteria2>:
        results.append(item)
  

Ответ №4:

Вы можете использовать функции filter() и itemgetter() (это должно быть быстрее, чем listcomp):

 from operator import itemgetter

d = [
    ['A', 'A1', {}],
    ['A', 'A2', {}],
    ['B', 'B1', {}],
]

itemget = itemgetter(0, 1)
result = filter(lambda x: itemget(x) == ('B', 'B1'), d)

for i in result:
    print(i)
# ['B', 'B1', {}]