Самый эффективный способ поиска списков списков Python на нескольких полях? - PullRequest
0 голосов
/ 06 марта 2019

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

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

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 06 марта 2019

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

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)
1 голос
/ 06 марта 2019

Понимание списка будет работать здесь:

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

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

0 голосов
/ 06 марта 2019

Вы можете использовать функции 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', {}]
0 голосов
/ 06 марта 2019

Попробуйте:

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)
...