在Python中查询数据

问题描述 投票:0回答:1

我看过很多帖子,但似乎没有一个能完全回答我所追求的。请注意,我目前的工作受到只有标准 Python 类可用的约束。

我希望解决的一般问题是根据可变查询模式在给定查询参数的列表中查找项目。即(并且请将以下内容视为伪代码)解决方案可能会收到以下请求:

  • 查找列表中与 element[1] == 2 且 element[3] != 5 匹配的所有行,

下一个请求可能是

  • 查找列表中与 element[6] == "Bob" 且 element[7] != None 且 element[12] >= 0 匹配的所有行

之后的请求可能是完全不同的查询。换句话说,我不知道可能需要多少或哪些元素以及什么条件。

更具体地说,我试图根据其中的列来识别 CSV 文件中的任何查询的行集。我对数据结构并不重视,我只是在努力寻找一种好方法来执行类似于 SQL 查询(在函数中)的操作。由于 csv 中的数据随着时间的推移而不一致,并且业务需求不断变化,因此将条件硬编码到代码中并不是一个好主意,因为它们会过时。

希望这可以使用标准类实现

除了大量谷歌搜索和大量使用硬编码条件的示例之外,我还没有真正尝试过任何其他方法。我一直在关注列表,这可能是我的问题。

我怀疑我可以针对 csv 中一行的每个元素循环遍历查询的每个元素,但是我将如何处理所有不同的比较器? - 听起来像是有人可能已经在一个漂亮整洁的小函数中完成了很多编码(我希望!)

python list dictionary search filter
1个回答
0
投票

也许你可以尝试使用

eval()
进行破解。

根据您对用户的信任程度,您可以对他们有权访问的全局和局部变量添加一些限制,但如果只是受信任的内部用户,只需🚢:

from collections.abc import Sequence
from typing import Any


def query_data(data: Sequence[tuple[Any, ...]],
               condition: str) -> Sequence[tuple[Any, ...]]:
  """Returns a list of tuples that match the passed in condition."""
  return [row for row in data if eval(condition)]


data = [
    (1, 2, 3, 4, 5),
    (1, 2, 3, 5, 5),
    (10, 9, 8, 7, 6),
    ('Alice', None, 'Bob', 0, -1),
    ('Bob', 'Alice', 'Charlie', 0, 1),
    ('Daniel', None, 'Evan', 1, 0),
]


print(f"""{query_data(data, 'row[1] == 2 and row[3] != 5') = }""")
print(f"""{query_data(data, 'row[0] == "Bob" and row[1] is not None and row[3] >= 0') = }""")
print(f"""{query_data(data, 'row[4] > 0') = }""")
print(f"""{query_data(data, 'isinstance(row[0], str) and row[0].startswith("A")') = }""")
print(f"""{query_data(data, 'row[1] == None') = }""")

输出:

query_data(data, 'row[1] == 2 and row[3] != 5') = [(1, 2, 3, 4, 5)]
query_data(data, 'row[0] == "Bob" and row[1] is not None and row[3] >= 0') = [('Bob', 'Alice', 'Charlie', 0, 1)]
query_data(data, 'row[4] > 0') = [(1, 2, 3, 4, 5), (1, 2, 3, 5, 5), (10, 9, 8, 7, 6), ('Bob', 'Alice', 'Charlie', 0, 1)]
query_data(data, 'isinstance(row[0], str) and row[0].startswith("A")') = [('Alice', None, 'Bob', 0, -1)]
query_data(data, 'row[1] == None') = [('Alice', None, 'Bob', 0, -1), ('Daniel', None, 'Evan', 1, 0)]
© www.soinside.com 2019 - 2024. All rights reserved.