Python:如何在表达式中创建列表理解之后重用它们

2024-09-30 08:34:34 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在使用列表理解和if-else表达式创建的表达式中重用相同的列表?在单个语句/表达式中实现(不使用任何中间变量) i、 e.index = 0 if [listcomprehension]为空,否则获取列表的第一个元素而不重新创建它

carIndex = [index
            for index, name in enumerate([car.name for car in cars]) 
            if "VW" in name or "Poodle" in name][0]

Tags: namein元素列表forindexif表达式
3条回答

如果我理解得好,你可以这样做:

tmp =  [index
        for index, name in enumerate([car.name for car in cars]) 
        if "VW" in car.name or "Poodle" in car.name]
carIndex = [0] if len(tmp)==0 else tmp

如果你不明白,或者不是你想要的,告诉我。你知道吗

如果你真的不想使用临时变量,有两种方法可以做到,但是这些方法有点非pythonic。你知道吗

这里有一个,使用lambda:

carIndex = (lambda x: 0 if not len(x) else x[1])(insert_list_comprehension_here)

编辑:一种pythonic方法是使用try-except。你知道吗

try:
    carIndex = [my_list_comprehension][1]
except IndexError:
    carIndex = 0

使用生成器表达式,然后将默认值设置为0,如果不存储列表,则创建一个没有意义的列表:

carIndex = next((index for index, name in enumerate(car.name for car in 
cars if "VW" in car.name or "Poodle" in car.name)),-1)

如果有匹配项,您的原始逻辑将始终返回0,因此我不确定这是否是您想要的。这将实际返回与cars中的名称匹配的car索引:

carIndex = next((index for index, car in enumerate(cars) 
if any(x in car.name for x in ("VW","Poodles"))), -1)

第一个例子相当于:

carIndex = next((0 for _ in (car for car in 
cars if "VW" in car.name or "Poodle" in car.name)),-1)

简单来说就是:

carIndex = 0 if any("VW" in car.name or "Poodle" in car.name for car in cars) else -1

相关问题 更多 >

    热门问题