0

假设我有一个这样的列表列表

lol = [[1, 'e_r_i'], [2, 't_u_p']]

我想对字符串元素应用一个函数,它返回几个值,我只需要一个子集(每个用例不同)。为了便于说明,我只是做一个简单的split()操作:

def dummy(s):
    return s.split('_')

现在,假设我只想要最后两个字母并将它们连接起来;有一个简单的选择

positions = []
for _, s in lol:
    stuff = dummy(s)
    positions.append(f"{stuff[1]}{stuff[2]}")

并在列表理解中做同样的事情

print([f"{dummy(s)[1]}{dummy(s)[2]}" for _, s in lol])

两者都给出相同的期望结果

['ri', 'up']

有没有办法在列表理解中使用海象运算符来避免调用dummy两次?

PS:不用说,实际上这个dummy函数要复杂得多,所以我没有寻找更好的解决方案,split但它完全是关于海象运算符的结构和潜在用途。

4

2 回答 2

3

我不得不说你的第一个显式循环是这里的最佳选择。这是清晰易读的代码,您无需重复任何调用。

尽管如此,正如你所要求的,你总是可以这样做:

print([f"{(y:=dummy(s))[1]}{y[2]}" for _, s in lol])

您还可以将处理包装在另一个函数中:

def dummy2(l):
    return f"{l[1]}{l[2]}"

这完全消除了对海象的需求并进一步简化了代码:

print([dummy2(dummy(s)) for _, s in lol])
于 2021-01-31T16:30:41.047 回答
1

是的。这就是你想要的

output = [f"{(stuff := dummy(s))[1]}{stuff[2]}" for _, s in lol]
于 2021-01-31T16:30:18.177 回答