Может быть, кто-то вроде этого?
>>>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 () / enumerate () на map (), что-то вроде
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, как показано в ответе Дейва Кирби (обратите внимание на синтаксис этого оператора when_true if condition else when_false
)