Заменить буквы в элементе списка на числа - PullRequest
2 голосов
/ 13 июля 2020

Я здесь новичок и довольно новичок в программировании. Недавно я начал изучать Python, чтобы узнать, как автоматизировать процессы в моих повседневных задачах.

Я работаю над сравнением 2 списков, которые я создал путем преобразования 2 столбцов из 2 файлов Excel в списки. Списки в основном содержат числа, но некоторые элементы содержат как целые числа, так и буквы, и я считаю, что в результате получается строка, а не целое число. Я хотел бы преобразовать буквы в числа, чтобы получить список целых чисел, чтобы можно было манипулировать, сравнивать и т. Д. c. Как я могу это сделать? Я использую openpyxl для доступа к своим файлам Excel. Ниже приведен пример того, что я хотел бы сделать.

Пример: ввод

list1 = [8635, 6227, '8651FRT', '8651BK','8295INSERT', 8295]

вывод

newlist1 = [8635, 6227, 865101, 865102,829503, 8295]

Я хотел бы заменить 'FRT' на 01 , «BK» с 02 и «INSERT» с 03. Я был бы очень признателен за помощь. Спасибо.

Ответы [ 6 ]

0 голосов
/ 13 июля 2020

Вы можете заменить строку количеством переменной. Может быть, вы это ищете.

list1 = [8635, 6227, '8651FRT', '8651BK','8295INSERT', 8295]
mod = []
c = 1

for val in list1:
    if (str(val).isnumeric()): mod.append(val)
    else:
        n = len(val)
        for i in range(n):
            if (not val[i].isnumeric()):
                if (c<10): 
                    mod.append(int(val[0:i]+'0'+str(c)))
                    c+=1
                    break
                else: 
                    mod.append(int(val[0:i]+str(c)))
                    c+=1
                    break

print(mod)

Спасибо

0 голосов
/ 13 июля 2020

Вы можете перебирать список значений. Когда вы сталкиваетесь с нецелым числом, вы можете убрать буквы и добавить к нему увеличивающийся счетчик. Затем вы добавляете этот счетчик в сопоставление, чтобы каждый раз использовать одно и то же значение. Это не требует предварительной работы или составления карт. Это предполагает, что буквы находятся в конце или после ваших чисел.

import re
list1 = [8635, 6227, '8651FRT', '8651BK','8295INSERT', 8295,8295 , '8295INSERT', '8651BK' , '8295INSERT', '8651BK',6227 , ]
mapping = {}
counter_ = 1
output_list = []
for x in list1:
    if isinstance(x, int):
        output_list.append(x)
        pass
    else:
        output = re.split(r'(\d+)', x)
        try:
            val = mapping[output[2]]
            output[2] = val
            output_list.append(''.join(output[1:]))
        except:
            mapping[output[2]] = '0'+str(counter_)
            output[2] = '0'+str(counter_)
            output_list.append(''.join(output[1:]))
        counter_ += 1

newlist = [int(x) for x in output_list]
0 голосов
/ 13 июля 2020

Это не лучший пример. Вы могли бы делать это быстрее и лучше. Но я думаю, понятно, как вы могли подойти к этому. :)

list1 = [8635, 6227, '8651FRT', '8651BK','8295INSERT', 8295]
newlist = []
# Check every item in list
for item in list1:
  # If its a integer, add to newlist
  if isinstance(item, int):
    newlist.append(item)
    continue
  # Else check and replace
  if 'FRT' in item:
    item = item.replace('FRT', '01')


 # Check other exception here
  
   newlist.append(int(item))
0 голосов
/ 13 июля 2020

Вы можете написать функцию для замены одного элемента (я не вижу простого ярлыка для этого), затем вы можете l oop поверх него в понимании списка.

import re

mappings = {'FRT': '01', 'BK': '02', 'INSERT': '03'}

def replace(val):
    
    if isinstance(val, int):
        return val
    
    m = re.match('(\d+)(\D+)$', val)
    if m:
        key = m.group(2)
        if key in mappings:
            return int(m.group(1) + mappings[key])

    raise ValueError('could not do replacement for {}'.format(val))


list1 = [8635, 6227, '8651FRT', '8651BK','8295INSERT', 8295]

print([replace(x) for x in list1])

дает:

[8635, 6227, 865101, 865102, 829503, 8295]
0 голосов
/ 13 июля 2020

Вы можете использовать:

newlist1 = [int(str(item).replace('FRT', '01').replace('BK', '02').replace('INSERT','03')) for item in list1]

Вся необходимая информация была найдена с помощью help(str), если вы хотите больше.

0 голосов
/ 13 июля 2020

один способ - определить dict со значениями для замены, за которыми следует re.sub для извлечения и замены значений.

import re

replace = {"FRT": "01", 'BK': "02", 'INSERT': "03"}

list1 = [8635, 6227, '8651FRT', '8651BK', '8295INSERT', 8295]

print(
    [int(re.sub(r"([A-Za-z]+)",
            lambda x: replace.get(x.group(1), ""), str(x))) for x in list1]
)
[8635, 6227, 865101, 865102, 829503, 8295]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...