也许有些”这样吗?
>>>inp = ("hello", "my", "friend")
>>>out = tuple([i == 1 and x.upper() or x for (x,i) in zip(t,range(len(t)))])
>>> out
('hello', 'MY', 'friend')
注:不是(x,i) in zip(t, range(len(t)))
我应该用枚举函数的思想:(i,x) in enumerate(t)
制作多一点一般:
而不是硬编码1,我们可以将它放在一个变量。
此外,通过为此目的使用元组,我们可以将该函数应用于多个索引处的元素。
>>>inp = ("hello", "my", "friend")
>>>ix = (0,2)
>>>out = tuple([i in ix and x.upper() or x for (i, x) in enumerate(t)])
>>> out
('HELLO', 'my', 'FRIEND')
另外,我们可以 “替代” 的zip()/枚举()的地图(),在像
out = tuple(map(lambda x,i : i == 1 and x.upper() or x, inp, range(len(inp))))
编辑:(涉及有关指定函数来评论适用):
可能是简单的东西如:
>>> f = str.upper # or whatever function taking a single argument
>>> out = tuple(map(lambda x,i : i == 1 and f(x) or x, inp, range(len(inp))))
既然我们谈到申请我们应该提一下condition and if_true or if_false
这个构造,它不是,而是的替代品,它代替了在其他语言中发现的if/else三元运算符。限制是该函数不能返回等于False的值(例如,None,0,0.0,'')。避免这个问题的建议是Python 2。5只及以上,使用真正的if-else三元运算符,如图戴维Kirby的答案(注意when_true if condition else when_false
语法该运营商的)
来源
2010-04-02 06:35:02
mjv
您可以将您的元组转换为(可变)列表,更改它的第n个元素,并在需要时将其转换回元组。但是如果你只需要迭代新的元组,为什么不创建一个简单的产生每个元素的生成器,除了第i个元素,它会产生func(元素)?只是一个想法,但。 – 2010-04-02 06:29:08
当然,我可以做mylist [idx] = func(mylist [idx]),但我想要一个功能风格的单线解决方案,以便我可以在return语句中使用它。 – Mathieu 2010-04-02 06:38:19
你的第一个解决方案是清晰,简洁,直接。如果它困扰你,那暗示它解决了错误的问题。 (顺便说一句,arr [0:i]可以是arr [:i]。) – 2010-04-02 07:42:01