在多个字段上搜索Python列表的最有效方法?

时间:2019-03-06 15:37:53

标签: python list sublist

我有一个数据结构,它是一个列表列表。每个子列表都有2个字符串和一个字典,因此总体结构如下:

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

我想做的是找到所有前两个值都符合某些条件的子列表,例如第一个值为“ B”,第二个值为“ B1”;如果这是一个数据库表,则等效内容将是

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

此查询可能有多个匹配项

什么是最好/最Pythonic的方式?

4 个答案:

答案 0 :(得分:2)

您可以使用列表理解:

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 :(得分:1)

列表理解将在这里起作用:

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

然后,您可以在每个循环中使用a来打印filtered的值。

答案 2 :(得分:0)

尝试:

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)

答案 3 :(得分:0)

您可以使用函数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', {}]