Groovy扩展点运算符的Python等效项

mznpcxlj  于 2022-11-01  发布在  Python
关注(0)|答案(1)|浏览(138)

我很喜欢Groovy处理集合和字典的方式,代码可读性很强,语法也很丰富。
具体来说,就是“spread-dot”运算符。它所做的是创建一个新的集合,该集合仅由所有子级的指定属性组成,例如

A = [
   { "a": "1", "b": "2"},
   { "a": "3", "b": "4"},
   { "a": "5", "b": "6"}
]
B = A*.b

B是[“2”、“4”、“6”]
Python的直接等效函数为
[a.b for a in A]
但使用起来很笨拙
有没有更好、更易读的方法?
在上面的例子中,情况并不坏,因为它只是一个级别,但是考虑一下这个

response.json().data.ConfigRecords.page.records*.ASV

[a['ASV'] for a in response.json()['data']['ConfigRecords']['page']['records']]
gwo2fgha

gwo2fgha1#

使用标准列表/字典,您需要[row["b"] for row in A]
对我来说,这不是一个很好读的代码。

A = [
   { "a": "1", "b": "2"},
   { "a": "3", "b": "4"},
   { "a": "5", "b": "6"}
]

print([row['b'] for row in A])

结果:

['2', '4', '6']

但如果使用pandas.DataFrame,则可以使用A.bA["b"]
最后,它可能需要.tolist()才能得到list,而不是pandas.Series

A = [
   { "a": "1", "b": "2"},
   { "a": "3", "b": "4"},
   { "a": "5", "b": "6"}
]

import pandas as pd

df = pd.DataFrame(A)

print(df['b'])   # pandas.Series
print(df.b)      # pandas.Series

print(df['b'].tolist())  # list
print(df.b.tolist())     # list

结果:

0    2
1    4
2    6
Name: b, dtype: object

0    2
1    4
2    6
Name: b, dtype: object

['2', '4', '6']

['2', '4', '6']

它也可以只选择某些行-即具有a > 2的行

A[ A.a > 2 ]['b']

对我来说,更有可读性的是将代码分成三行。

data = response.json()
records = data['data']['ConfigRecords']['page']['records']
asv = [item['ASV'] for item in records]

相关问题