Элементы внутри строк в скобках умножить на (-1)
Подскажите пожалуйста как найти элементы начинающиеся на '(' и умножить их на (-1). Чтобы в новый список сохранились элементы положительные и отрицательные (со скобочками которые)
Исходное:
['2 342 746', '(4 836 482)', '7 493 332', '-', 'плрстгарг']
Конечное:
[2342746, - 4836482, 7493332]
Мой код:
my = ['2 342 746', '(4 836 482)', '7 493 332']
def test(data: str):
if num := ''.join(filter(str.startswith('('), data)):
return int(num) * (-1)
if num := ''.join(filter(str.isdigit, data)):
return int(num)
test1 = list(map(test, my))
print(test1)
Я так понимаю что в первом if возвращается только индекс а не то что я хочу.
Ответы (3 шт):
Автор решения: Namerek
→ Ссылка
import re
my = ['2 342 746', '(4 836 482)', '7 493 332', '-', 'плрстгарг']
def fmt(item: str):
# Если после всех манипуляций в строке что-то осталось
# Пытаемся привести значение к int
return int(val) if (
val := re.sub(
# Все не цифры и не знак минус
# или знак минус за которым нет цифр,
# или знак минус который находится не в начале строки
# меняем на пустую строку
r'[^\d-]|-(?!\d)|(?<!^)-', '',
re.sub(
# Забираем в группу все, что находится между скобками
# (без самих скобок)
# и возвращаем символы группы добавив знак `-` веперди
# (если соответствующа условию строка не была найдена
# вернет оригинал строки)
r'\((.+)\)', r'-\1', item
)
)
# Если получили пустую строку то возврашаем None
) else None
# применяем функцию к списку значение и убираем из результата None
test1 = list(filter(None, map(fmt, my)))
print(test1)
# [2342746, -4836482, 7493332]
Автор решения: SukhovPro
→ Ссылка
Не так красиво, зато спустя годы понятно будет что хотели.
my = ['2 342 746', '(4 836 482)', '7 493 332']
def test(data: str):
data = data.replace(" ", "")
if data.startswith('('):
return int(data.replace("(", "").replace(")", "")) * (-1)
else:
return int(data)
test1 = list(map(test, my))
print(test1)
Автор решения: CrazyElf
→ Ссылка
Однострочник, например:
my = ['2 342 746', '(4 836 482)', '7 493 332']
print([-int(y[1:-1]) if y.startswith('(') else int(y) for y in (x.replace(' ', '') for x in my)])