Python:join string list if else oneliner

Python:join string list if else oneliner,python,string,pandas,Python,String,Pandas,使用Pandas时,我必须重写作为dict实现的查询: query = {"height": 175} 键是查询的属性,值可以是标量或iterable。 在第一部分中,我检查值是否为而不是NaN和scalar。 如果此条件成立,我将使用=符号编写查询表达式,但如果值为Iterable,我将需要使用in关键字编写表达式。 这是我需要修复的实际代码,以便使用Iterables import numpy as np from collections import Iterable def que

使用Pandas时,我必须重写作为dict实现的查询:

query = {"height": 175}
键是查询的属性,值可以是标量或iterable。 在第一部分中,我检查值是否为
而不是NaN和scalar
。 如果此条件成立,我将使用
=
符号编写查询表达式,但如果值为
Iterable
,我将需要使用
in
关键字编写表达式。 这是我需要修复的实际代码,以便使用Iterables

import numpy as np
from collections import Iterable


def query_dict_to_expr(query: dict) -> str:
    expr = " and ".join(["{} == {}"
                        .format(k, v) for k, v in query.items()
                         if (not np.isnan(v)
                             and np.isscalar(v))
                         else "{} in @v".format(k) if isinstance(v, Iterable)
                         ]
                        )
    return expr

但是我得到了与
else
语句对应的无效语法。

如果我理解正确,您不需要检查类型:

In [47]: query
Out[47]: {'height': 175, 'lst_col': [1, 2, 3]}

In [48]: ' and '.join(['{} == {}'.format(k,v) for k,v in query.items()])
Out[48]: 'height == 175 and lst_col == [1, 2, 3]'
演示:


你把
if/else
放错了地方。如果将
If
放在
for
之后,就像在iterable If g(x)
中的
f(x)for x一样,这将过滤iterable的元素(并且不能与
else
组合)。相反,您希望保留所有元素,即在iterable中为x使用
f(x)
其中
f(x)
恰好是一个三元表达式,即形式为
a(x)如果c(x)或者b(x)

相反,可以这样尝试(简化的非numpy示例):


如果是instance(v,Iterable)
,则可能重复@v.格式(k)中的
else“{}”。如果有第二个
,为什么要写第二个
。它必须是else-if语句。不能将
if
再次放在
else
之后。列表理解无法获取它是嵌套的if/else子句。
In [53]: df = pd.DataFrame(np.random.randint(5, size=(5,3)), columns=list('abc'))

In [54]: df
Out[54]:
   a  b  c
0  0  0  3
1  4  2  4
2  2  2  3
3  0  1  0
4  0  4  1

In [55]: query = {"a": 0, 'b':[0,4]}

In [56]: q = ' and '.join(['{} == {}'.format(k,v) for k,v in query.items()])

In [57]: q
Out[57]: 'a == 0 and b == [0, 4]'

In [58]: df.query(q)
Out[58]:
   a  b  c
0  0  0  3
4  0  4  1
>>> query = {"foo": 42, "bar": [1,2,3]}  
>>> " and ".join(["{} == {}".format(k, v)
                  if not isinstance(v, list)
                  else "{} in {}".format(k, v)
                  for k, v in query.items()])
'foo == 42 and bar in [1, 2, 3]'