python 3.4 list comprehension - 在列表中调用临时变量

Cry*_*sie 4 python list

我有一个字典列表,我想根据某些条件提取某些数据.如果货币显示美元且大于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)

Jef*_*ado 7

使用理解没有很好的语法.你可以使用内部生成器来生成值以减少重复,但是它会变得难以理解,它会变得越复杂.

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)