我有一个字典列表,我想根据某些条件提取某些数据.如果货币显示美元且大于0,我想只提取货币(如int/float).
curr = [{'currency': '6000.0000,EUR', 'name': 'Bob'},
{'currency': '0.0000,USD', 'name': 'Sara'},
{'currency': '2500.0000,USD', 'name': 'Kenny'},
{'currency': '0.0000,CND', 'name': 'Debbie'},
{'currency': '2800.0000,USD', 'name': 'Michael'},
{'currency': '1800.0000,CND', 'name': 'Aaron'},
{'currency': '2500.0000,EUR', 'name': 'Peter'}]
Run Code Online (Sandbox Code Playgroud)
结果:
usd_curr = [2500.0000, 2800.0000]
Run Code Online (Sandbox Code Playgroud)
这就是我所做的.
usd_curr = [line for line in data if ',USD' in line['currency']]
usd_curr = [float(elem['currency'].split(',')[0]) for elem in curr if float(elem['currency'].split(',')[0]) > 0]
Run Code Online (Sandbox Code Playgroud)
列表有效,但我的问题是这个 - 有更好的方法在列表推导中使用变量,所以它看起来像这样:
usd_curr = [var = float(elem['currency'].split(',')[0]) for elem in curr if var > 0]
Run Code Online (Sandbox Code Playgroud)
使用理解没有很好的语法.你可以使用内部生成器来生成值以减少重复,但是它会变得难以理解,它会变得越复杂.
usd_curr = [
float(val)
for val, val_type in (elem['currency'].split(',') for elem in curr)
if val_type == 'USD' and float(val) > 0
]
Run Code Online (Sandbox Code Playgroud)
我建议改用命名生成器.
def get_currency_by_type(curr, curr_type):
for elem in curr:
val, val_type = elem['currency'].split(',')
if val_type == curr_type and float(val) > 0:
yield float(val)
usd_curr = list(get_currency_by_type(curr, 'USD'))
Run Code Online (Sandbox Code Playgroud)