Python 3.4列表推导式 - 在列表中调用临时变量

4
我有一个字典列表,想根据某些条件提取特定的数据。如果货币显示为美元且大于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'}]

结果:

usd_curr = [2500.0000, 2800.0000]

这是我所做的事情。
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]

这个列表是可以使用的,但我的问题实际上是这样的 - 是否有更好的方法在列表推导式中使用变量,使其看起来像这样:
usd_curr = [var = float(elem['currency'].split(',')[0]) for elem in curr if var > 0] 

不,你不能在推导式中创建变量。你要么必须像第一个例子中那样重复表达式,要么使用两个推导式。后一种选项,使用一个推导式提取数据,另一个推导式过滤掉零可能更易读。 - BrenBarn
usd_curr зїЩеЗЇжЙАжЬЙдїЈеАЉ >0 зЪДиіІеЄБгАВ usd_curr==> [6000.0, 2500.0, 2800.0, 1800.0, 2500.0]гАВ - Praveen
@Praveen - 如果我不想通过美元获取货币,那就是正确的。在这种情况下,如果字符串包含单词“USD”,我想要获取货币。 - Cryssie
@BrenBarn - 谢谢。把它分成两个列表会比重复表达式更快吗? - Cryssie
@muraveill 为什么不把它变成一个答案呢? - ᴀʀᴍᴀɴ
显示剩余2条评论
2个回答

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
]

我建议使用命名生成器。
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'))

0
我会使用两个推导式,但第一个不会分配列表,而是创建一个迭代器。
temp = (float(elem['currency'].split(',')[0]) for elem in curr)  # an iterator, not evaluated yet
usd_curr = [x for x in temp if x > 0]

你也可以使用map和filter,以函数式风格编写代码,这可能是上面代码生成的方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接