也許有些」這樣嗎?
>>>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