将列表中的OR条件表达式连接到“|”

时间:2016-09-10 02:34:42

标签: python amazon-dynamodb

这可能是一个与python lang相关的问题,而不是boto3 lib:

该查询有效:

matches = table.query(
    IndexName="status-date-index",
    KeyConditionExpression=Key('status').eq('next'),
    FilterExpression=Attr('teams').contains('a') | Attr('teams').contains('b') | Attr('teams').contains('c')
)

但我会有一个可变列表["a", "b", "c", ...N],需要将它们转换为

filter_expression = Attr('teams').contains('a') | Attr('teams').contains('b') | Attr('teams').contains('c') | ...N

任何想法如何在python中做到这一点?或者我可能需要为这种情况做一个更好的FilterExpression?

boto3.dynamodb.conditions.Attr reference.

2 个答案:

答案 0 :(得分:1)

您可以使用functools.reducecontains(我假设属于ConditionBase类型)生成的项目列表中使用or_ operatorfunctools.map。你也可以在字符串上加上link,因为你有一堆类似的输入。考虑这个简化的例子:

>>> from functools import map
>>> from functools import reduce
>>> from operator import or_
>>> values = ['9', '3', '7', '32']
>>> map(int, values)
[9, 3, 7, 32]
>>> reduce(or_, map(int, values))
47

完全等同于

>>> 9 | 3 | 7 | 32
47

为了进一步简化从Condition生成Attr(field).contains(value)个对象,可以通过列表理解构建一个2元组列表,如此(基于您的原始问题):

raw_conditions = [
    ('teams', 'a'),
    ('b', 'cali'),
    ('teams', 'c'),
]

conditions = [Attr(field).contains(value) for field, value in raw_conditions]
filter_expression = reduce(or_, conditions)

答案 1 :(得分:0)

import operator
filter_exp = reduce(operator.or_, (Attr('teams').contains(x) for x in 'abc'))