преобразовать смешанный список строк в список целых чисел - PullRequest
0 голосов
/ 01 сентября 2011

Я не знаком с python, и мне нужна помощь для преобразования списка, содержащего строки и числа (все представлены в виде строк!), В новый список, содержащий только цифры.

  • входная строка: ['LOAD','0x00134','0','0','R','E','0x1df0','0x1df0']
  • необходим результат: [0x00134,0,0,0x1df0,0x1df0]

Все нечисловые записи, такие как «LOAD» и «R», «E», должны быть удалены.

Ответы [ 4 ]

2 голосов
/ 01 сентября 2011
input = ['LOAD','0x00134','0','0','R','E','0x1df0','0x1df0']

def tryInt(x):
    base = 10
    if x.startswith('0x'): base = 16
    try: return int(x, base)
    except ValueError: return None

filter(lambda x: x is not None, map(tryInt, input))
1 голос
/ 01 сентября 2011

Может быть излишним, но очень гибким решением.Вы можете поддержать восьмеричные или римские числа позже; -)

import re

parsing_functions = [
    (r'^(\d+)$', int),
    (r'^0x([\dA-F]+)$(?i)', lambda x:int(x,16))
]
parsing_functions = [(re.compile(x),y) for x,y in parsing_functions]

def parse_integers(input) :
    result = []
    for x in input :
        for regex, parsing_function in parsing_functions :
            match = regex.match(x)
            if match :
                result.append(parsing_function(match.group(1)))
    return result

input = ['LOAD','0x00134','0','0','R','E','0x1df0','0x1df0']
print parse_integers(input)
0 голосов
/ 01 сентября 2011

Вы можете использовать эту функцию из: http://rosettacode.org/wiki/Determine_if_a_string_is_numeric#Python

def is_numeric(lit):
    'Return value of numeric literal string or ValueError exception'

    # Handle '0'
    if lit == '0': return 0
    # Hex/Binary
    litneg = lit[1:] if lit[0] == '-' else lit
    if litneg[0] == '0':
        if litneg[1] in 'xX':
            return int(lit,16)
        elif litneg[1] in 'bB':
            return int(lit,2)
        else:
            try:
                return int(lit,8)
            except ValueError:
                pass

    # Int/Float/Complex
    try:
        return int(lit)
    except ValueError:
        pass
    try:
        return float(lit)
    except ValueError:
        pass
    return complex(lit)

Таким образом:

def main():
    values = ['LOAD', '0x00134', '0', '0', 'R', 'E', '0x1df0', '0x1df0']
    numbers = []
    for value in values:
        try:
            number = is_numeric(value)
        except ValueError:
            continue
        numbers.append(number)
0 голосов
/ 01 сентября 2011
def list2num(mylist):
    result = []
    for item in mylist:
        try:
            if item.lower().startswith("0x"):
                result.append(int(item, 16))
            else:
                result.append(int(item))
        except ValueError:
            pass
    return result

Это дает вам

>>> numbers = ['LOAD','0x00134','0','0','R','E','0x1df0','0x1df0']
>>> list2num(numbers)
[308, 0, 0, 7664, 7664]

Или лучше, если вам нужен итератор, нам не нужно создавать этот список результатов в памяти:

def list2num(mylist):
    for item in mylist:
        try:
            if item.lower().startswith("0x"):
                yield int(item, 16)
            else:
                yield int(item)
        except ValueError:
            pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...