在多个字段上搜索 Python 列表列表的最有效方法?
Most efficient way to seach Python list of lists on multiple fields?
我有一个数据结构,它是一个列表列表。每个子列表都有 2 个字符串和一个字典,所以总体结构如下:
[
[ 'A', 'A1', { .... }],
[ 'A', 'A2', { .... }],
[ 'B'. 'B1', { .... }],
....
]
我想要做的是找到前两个值都符合某些条件的所有子列表 - 例如,第一个值是 'B',第二个是 'B1' ;如果这是一个数据库 table,等同于
Select * from whatever where column1 = 'B' and column2 = 'B1'
此查询可能有多个匹配项
执行此操作的 best/most Pythonic 方法是什么?
尝试:
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)
您可以使用列表理解:
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)
列表理解适用于此:
filtered = [mylist for mylist in mainlist if mainlist[0] == 'B' and mainlist[1] == 'B1']
然后您可以使用 for each 循环打印出 filtered
的值。
您可以使用函数 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', {}]
我有一个数据结构,它是一个列表列表。每个子列表都有 2 个字符串和一个字典,所以总体结构如下:
[
[ 'A', 'A1', { .... }],
[ 'A', 'A2', { .... }],
[ 'B'. 'B1', { .... }],
....
]
我想要做的是找到前两个值都符合某些条件的所有子列表 - 例如,第一个值是 'B',第二个是 'B1' ;如果这是一个数据库 table,等同于
Select * from whatever where column1 = 'B' and column2 = 'B1'
此查询可能有多个匹配项
执行此操作的 best/most Pythonic 方法是什么?
尝试:
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)
您可以使用列表理解:
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)
列表理解适用于此:
filtered = [mylist for mylist in mainlist if mainlist[0] == 'B' and mainlist[1] == 'B1']
然后您可以使用 for each 循环打印出 filtered
的值。
您可以使用函数 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', {}]