Python 3-基于字符串的字典搜索列表

约翰史密斯101

说我有琴弦

"((attr1=25 and attr2=8) or attr3=15)"

或者

"((attr1>25 and attr2<50) or (attr3=10 and attr4=20))"

或者

"(attrXYZ=10)"

甚至

"(attr1=20 and attr2=20 and attr3=20 and attr4=20)"

以及包含字典的列表,其中每个字典在字符串中可能具有也可能没有指定的属性。Python中有没有一种简单的方法来过滤与这种类型的字符串查询匹配的字典?

古斯塔夫

免责声明:这是一个非常懒惰和不安全的解决方案,它使用Python的两个最不诚实的函数evalexec,但是如果输出的形状与您提供的形状完全相同,则可以使用。

我们的策略是编辑输入以使其看起来类似于Python自然理解的语法,而不是创建我们自己的解析器。这样做,我们将使用dis模块(Python字节码的Disassembler)获取字符串中的所有名称。

import dis 

class Number:
    def __init__(self, n, exists=True):
        self.n = n
        self.exists = exists

    def __lt__(self, other):
        return self.n < other if self.exists else False

    def __le__(self, other):
        return self.n <= other if self.exists else False

    def __eq__(self, other):
        return self.n == other if self.exists else False

    def __ne__(self, other):
        return self.n != other if self.exists else False

    def __gt__(self, other):
        return self.n > other if self.exists else False

    def __ge__(self, other):
        return self.n >= other if self.exists else False


def clear_entries(entry):
    entry_output = entry.replace('!=', '<>').replace('=','==').replace('<>','!=')
    return entry_output

def check_condition(dict_, str_):
    str_ = clear_entries(str_)

    for k, v in dict_.items():
        exec("{0} = {1}".format(k, v))

    all_names = dis.Bytecode(str_).codeobj.co_names
    l_ = locals()
    non_defined_names = [v for v in all_names if v not in l_]

    for name in non_defined_names:
        exec("{0} = Number(0, exists=False)".format(name))  # the number value does not matter here (because of the 'exists' flag)

    if eval(str_):
        return True

    return False

测验

if __name__ == '__main__':
    entries = [
        "((attr1=25 and attr2=8) or attr3=15)",
        "((attr1>25 and attr2<50) or (attr3=10 and attr4=20))",
        "(2<attrXYZ<10)",
        "(attr1=20 and attr2=20 and attr3=20 and attr4=20)",
        "(attr1=20 or (attr2=20 and attr3=20 and attr4=20 and attr1231231=1))"
    ]

    dicts = [
        {'attr1': 25, 'attr2': 8, 'attr3': 123},
        {'attr1': 1, 'attr2': 8, 'attr3': 123},
        {'attr1': 26, 'attr2': 8, 'attr3': 123, 'attr4': 1},
        {'attr1': 1, 'attr2': 50, 'attr3': 1, 'attr4': 20},
        {'attr1': -1, 'attr2': 50, 'attr3': 1, 'attr4': 20},
        {'attrXYZ': 3},
        {'attrXYZ': 10},
        {'attr1': 20}

    ]

    for entry in entries:
        for d in dicts:
            print(check_condition(d, entry), '"{0}"'.format(entry), d)

结果

(True, '"((attr1=25 and attr2=8) or attr3=15)"', {'attr1': 25, 'attr2': 8, 'attr3': 123})
(False, '"((attr1=25 and attr2=8) or attr3=15)"', {'attr1': 1, 'attr2': 8, 'attr3': 123})
(False, '"((attr1=25 and attr2=8) or attr3=15)"', {'attr1': 26, 'attr2': 8, 'attr3': 123, 'attr4': 1})
(False, '"((attr1=25 and attr2=8) or attr3=15)"', {'attr1': 1, 'attr2': 50, 'attr3': 1, 'attr4': 20})
(False, '"((attr1=25 and attr2=8) or attr3=15)"', {'attr1': -1, 'attr2': 50, 'attr3': 1, 'attr4': 20})
(False, '"((attr1=25 and attr2=8) or attr3=15)"', {'attrXYZ': 3})
(False, '"((attr1=25 and attr2=8) or attr3=15)"', {'attrXYZ': 10})
(False, '"((attr1=25 and attr2=8) or attr3=15)"', {'attr1': 20})
(False, '"((attr1>25 and attr2<50) or (attr3=10 and attr4=20))"', {'attr1': 25, 'attr2': 8, 'attr3': 123})
(False, '"((attr1>25 and attr2<50) or (attr3=10 and attr4=20))"', {'attr1': 1, 'attr2': 8, 'attr3': 123})
(True, '"((attr1>25 and attr2<50) or (attr3=10 and attr4=20))"', {'attr1': 26, 'attr2': 8, 'attr3': 123, 'attr4': 1})
(False, '"((attr1>25 and attr2<50) or (attr3=10 and attr4=20))"', {'attr1': 1, 'attr2': 50, 'attr3': 1, 'attr4': 20})
(False, '"((attr1>25 and attr2<50) or (attr3=10 and attr4=20))"', {'attr1': -1, 'attr2': 50, 'attr3': 1, 'attr4': 20})
(False, '"((attr1>25 and attr2<50) or (attr3=10 and attr4=20))"', {'attrXYZ': 3})
(False, '"((attr1>25 and attr2<50) or (attr3=10 and attr4=20))"', {'attrXYZ': 10})
(False, '"((attr1>25 and attr2<50) or (attr3=10 and attr4=20))"', {'attr1': 20})
(False, '"(2<attrXYZ<10)"', {'attr1': 25, 'attr2': 8, 'attr3': 123})
(False, '"(2<attrXYZ<10)"', {'attr1': 1, 'attr2': 8, 'attr3': 123})
(False, '"(2<attrXYZ<10)"', {'attr1': 26, 'attr2': 8, 'attr3': 123, 'attr4': 1})
(False, '"(2<attrXYZ<10)"', {'attr1': 1, 'attr2': 50, 'attr3': 1, 'attr4': 20})
(False, '"(2<attrXYZ<10)"', {'attr1': -1, 'attr2': 50, 'attr3': 1, 'attr4': 20})
(True, '"(2<attrXYZ<10)"', {'attrXYZ': 3})
(False, '"(2<attrXYZ<10)"', {'attrXYZ': 10})
(False, '"(2<attrXYZ<10)"', {'attr1': 20})
(False, '"(attr1=20 and attr2=20 and attr3=20 and attr4=20)"', {'attr1': 25, 'attr2': 8, 'attr3': 123})
(False, '"(attr1=20 and attr2=20 and attr3=20 and attr4=20)"', {'attr1': 1, 'attr2': 8, 'attr3': 123})
(False, '"(attr1=20 and attr2=20 and attr3=20 and attr4=20)"', {'attr1': 26, 'attr2': 8, 'attr3': 123, 'attr4': 1})
(False, '"(attr1=20 and attr2=20 and attr3=20 and attr4=20)"', {'attr1': 1, 'attr2': 50, 'attr3': 1, 'attr4': 20})
(False, '"(attr1=20 and attr2=20 and attr3=20 and attr4=20)"', {'attr1': -1, 'attr2': 50, 'attr3': 1, 'attr4': 20})
(False, '"(attr1=20 and attr2=20 and attr3=20 and attr4=20)"', {'attrXYZ': 3})
(False, '"(attr1=20 and attr2=20 and attr3=20 and attr4=20)"', {'attrXYZ': 10})
(False, '"(attr1=20 and attr2=20 and attr3=20 and attr4=20)"', {'attr1': 20})
(False, '"(attr1=20 or (attr2=20 and attr3=20 and attr4=20 and attr1231231=1))"', {'attr1': 25, 'attr2': 8, 'attr3': 123})
(False, '"(attr1=20 or (attr2=20 and attr3=20 and attr4=20 and attr1231231=1))"', {'attr1': 1, 'attr2': 8, 'attr3': 123})
(False, '"(attr1=20 or (attr2=20 and attr3=20 and attr4=20 and attr1231231=1))"', {'attr1': 26, 'attr2': 8, 'attr3': 123, 'attr4': 1})
(False, '"(attr1=20 or (attr2=20 and attr3=20 and attr4=20 and attr1231231=1))"', {'attr1': 1, 'attr2': 50, 'attr3': 1, 'attr4': 20})
(False, '"(attr1=20 or (attr2=20 and attr3=20 and attr4=20 and attr1231231=1))"', {'attr1': -1, 'attr2': 50, 'attr3': 1, 'attr4': 20})
(False, '"(attr1=20 or (attr2=20 and attr3=20 and attr4=20 and attr1231231=1))"', {'attrXYZ': 3})
(False, '"(attr1=20 or (attr2=20 and attr3=20 and attr4=20 and attr1231231=1))"', {'attrXYZ': 10})
(True, '"(attr1=20 or (attr2=20 and attr3=20 and attr4=20 and attr1231231=1))"', {'attr1': 20})

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python 3:如何搜索和检索构成字典的所有列表(如果它们包含特定字符串)

来自分类Dev

Python 3 - 如何将字符串转换为字典列表

来自分类Dev

Python3-将字符串转换为字典

来自分类Dev

Python3:将字典键从字符串更改为字符串元组

来自分类Dev

连接字符串数字列表以创建整数Python 3

来自分类Dev

Python3过滤/删除列表的字符串

来自分类Dev

Python 3:For 循环比较列表中的字符串

来自分类Dev

Python字典 - 无法在字符串后搜索太阳字符串的字典

来自分类Dev

Python字典搜索未找到给定字符串的结果

来自分类Dev

如何在python3中使用搜索从主字符串获取空格前后的子字符串?

来自分类Dev

将字符串转换为Python字典列表

来自分类Dev

Python解析包含函数,列表和字典的字符串

来自分类Dev

在字典查找中使用Python列表或字符串?

来自分类Dev

将字符串转换为python列表和字典?

来自分类Dev

python3嵌套字典解压缩格式字符串

来自分类Dev

在终端中使用字典将字符串打印为垂直横幅。PYTHON3

来自分类Dev

Python3.x-使用字典计算所有子字符串的出现

来自分类Dev

在 Python3 中使用字典键创建一行字符串

来自分类Dev

在列表中搜索python中的多个子字符串?

来自分类Dev

python字典字符串

来自分类Dev

将列表的大字符串表示形式转换为列表Python 3

来自分类Dev

将列表转换为字符串并返回列表 Python 3

来自分类Dev

Python字符串:如何查询列表中的字典,这些字典在字典中

来自分类Dev

在 python 3.x 中,如何从列表中的字符串中删除子字符串?

来自分类Dev

Python如何基于列表中的项目从字符串中剥离字符串

来自分类Dev

如何在基于包含类似 Jinja 的 Python 分隔符的字符串值的复杂树状嵌套字典中搜索键值对

来自分类Dev

Python 3中的字符串替换?

来自分类Dev

使用 Python 3 的字符串练习

来自分类Dev

python 3空字符串错误

Related 相关文章

  1. 1

    Python 3:如何搜索和检索构成字典的所有列表(如果它们包含特定字符串)

  2. 2

    Python 3 - 如何将字符串转换为字典列表

  3. 3

    Python3-将字符串转换为字典

  4. 4

    Python3:将字典键从字符串更改为字符串元组

  5. 5

    连接字符串数字列表以创建整数Python 3

  6. 6

    Python3过滤/删除列表的字符串

  7. 7

    Python 3:For 循环比较列表中的字符串

  8. 8

    Python字典 - 无法在字符串后搜索太阳字符串的字典

  9. 9

    Python字典搜索未找到给定字符串的结果

  10. 10

    如何在python3中使用搜索从主字符串获取空格前后的子字符串?

  11. 11

    将字符串转换为Python字典列表

  12. 12

    Python解析包含函数,列表和字典的字符串

  13. 13

    在字典查找中使用Python列表或字符串?

  14. 14

    将字符串转换为python列表和字典?

  15. 15

    python3嵌套字典解压缩格式字符串

  16. 16

    在终端中使用字典将字符串打印为垂直横幅。PYTHON3

  17. 17

    Python3.x-使用字典计算所有子字符串的出现

  18. 18

    在 Python3 中使用字典键创建一行字符串

  19. 19

    在列表中搜索python中的多个子字符串?

  20. 20

    python字典字符串

  21. 21

    将列表的大字符串表示形式转换为列表Python 3

  22. 22

    将列表转换为字符串并返回列表 Python 3

  23. 23

    Python字符串:如何查询列表中的字典,这些字典在字典中

  24. 24

    在 python 3.x 中,如何从列表中的字符串中删除子字符串?

  25. 25

    Python如何基于列表中的项目从字符串中剥离字符串

  26. 26

    如何在基于包含类似 Jinja 的 Python 分隔符的字符串值的复杂树状嵌套字典中搜索键值对

  27. 27

    Python 3中的字符串替换?

  28. 28

    使用 Python 3 的字符串练习

  29. 29

    python 3空字符串错误

热门标签

归档