Python:join string list if else oneliner
使用Pandas时,我必须重写作为dict实现的查询: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
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]'