разобрать заключенные в скобки числа в отрицательные числа - PullRequest
1 голос
/ 29 мая 2019

Как я могу разобрать заключенные в скобки числа в списке строк в отрицательные числа (или строки с отрицательным знаком).

пример

input  
list1= ['abcd','(1,234)','Level-2 (2):','(31)%', 'others','(3,102.2)%']  

output  
['abcd',-1234,'Level-2 (2):','-31%', 'others','-3102.2%']

только строки с числами в скобках или числа с запятой / точкой внутри скобок, за которыми следует знак процента (%), должны быть проанализированы. другие строки, такие как 'Level-2 (2):', анализировать не следует.

Я пытался

translator = str.maketrans(dict.fromkeys('(),'))
['-'+(x.translate(translator)) for x in list1]

но вывод такой (каждый элемент имеет - добавленный)

['-abcd', '-1234', '-Level-2 2:', '-31%', '-others', '-3102.2%']

Ответы [ 4 ]

4 голосов
/ 29 мая 2019

Вы можете попробовать использовать re.sub, например:

import re

list1 = ['abcd','(1,234)','Level-2 (2):','(31)%', 'others','(3,102.2)%']
res = [re.sub(r'^\(([\d+.,]+)\)(%?)$', r'-\1\2', el) for el in list1] 
# ['abcd', '-1,234', 'Level-2 (2):', '-31%', 'others', '-3,102.2%']
2 голосов
/ 29 мая 2019

Попробуйте использовать re.match

Пример:

import re

list1= ['abcd','(1,234)','Level-2 (2):','(31)%', 'others','(31.2)%']  
result = []
for i in list1:
    m = re.match(r"\((\d+[.,]?\d*)\)(%?)", i) 
    if m:
        result.append("-" + m.group(1)+m.group(2))
    else:
        result.append(i)
print(result)

Выход:

['abcd', '-1,234', 'Level-2 (2):', '-31%', 'others', '-31.2%']

Обновление согласно комментарию

import re

list1 = ['abcd','(1,234)','Level-2 (2):','(31)%', 'others','(3,102.2)%']  
result = []
for i in list1:
    m = re.match(r"\((\d+(?:,\d+)*(?:\.\d+)?)\)(%?)", i) 
    if m:
        result.append("-" + m.group(1).replace(",", "")+m.group(2))
    else:
        result.append(i)
print(result)

Вывод:

['abcd', '-1234', 'Level-2 (2):', '-31%', 'others', '-3102.2%']
1 голос
/ 29 мая 2019

Если вам не нужно преобразовывать значение в int или float, re.match и str.translate должны выполнить трюк:

rx = re.compile('\([\d,.]+\)%?$')
tab = str.maketrans({i: None for i in '(),'})

output = ['-' + i.translate(tab) if rx.match(i) else i for i in list1]

Это дает:

['abcd', '-1234', 'Level-2 (2):', '-31%', 'others', '-3102.2%']
0 голосов
/ 29 мая 2019
for item in list1:
    idx = list1.index(item)
    list1[idx] = '-' + list1[idx].replace('(','').replace(')','').replace(',','')

print (list1)

выход:

['-abcd', '-1234', '-Level-2 2:', '-31%', '-others', '-3102.2%']

или просто:

list1= ['abcd','(1,234)','Level-2 (2):','(31)%', 'others','(3,102.2)%']

print (['-' + item.replace('(','').replace(')','').replace(',','') for item in list1])

выход:

['-abcd', '-1234', '-Level-2 2:', '-31%', '-others', '-3102.2%']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...