Я принимаю l=['1','2','3','rt4','rt5'] в качестве входных данных и преобразую его в l=[1,2,3,'rt4','rt5'] со следующим кодом:

def RepresentsInt(s):
    try: 
        int(s)
        return True
    except ValueError:
        return False

l=['1','2','3','rt4','rt5']
l=[int(l[i]) if RepresentsInt(l[i]) else l[i] for i in range(0,len(l))]  

Могу ли я улучшить приведенный выше код, используя понимание?

-3
Vineet Jain 29 Авг 2017 в 13:40

4 ответа

Лучший ответ

Вы можете изменить функцию RepresentsInt так, чтобы она действительно возвращала целое число (если возможно), что значительно упростило бы это:

def RepresentsInt(s):
    try: 
        return int(s)
    except ValueError:
        return s

Тогда код для преобразования списка можно записать в виде (использование цикла for item in l, вероятно, лучше, чем итерации по индексам):

>>> l = ['1','2','3','rt4','rt5']
>>> [RepresentsInt(item) for item in l]
[1, 2, 3, 'rt4', 'rt5']

Или, если вы хотите, чтобы в качестве шаблона многократного использования вам все еще нужна вспомогательная функция (я выбрал подход, подобный декоратору), потому что вы не можете использовать try и / или except в вычислениях:

def try_to_apply_func(func, exception):
    def newfunc(value):
        try:
            return func(value)
        except exception:
            return value
    return newfunc

>>> to_int_if_possible = try_to_apply_func(int, ValueError)
>>> [to_int_if_possible(item) for item in l]  
[1, 2, 3, 'rt4', 'rt5']

>>> to_float_if_possible = try_to_apply_func(float, ValueError)
>>> [to_float_if_possible(item) for item in l]  
[1.0, 2.0, 3.0, 'rt4', 'rt5']
3
MSeifert 29 Авг 2017 в 11:23

Это действительно неясно, что вы хотите, но, возможно, что-то вроде:

>>> l=['1','2','3','rt4','rt5']
>>> l=[int(i) if i.isdigit() else i for i in l]
>>> l
[1, 2, 3, 'rt4', 'rt5']
3
Dadep 29 Авг 2017 в 11:01

Я не верю (хотя я в конечном итоге могу ошибаться), что есть более чистый и аккуратный способ добиться этого. Одним из решений было бы создание целочисленного выражения lambda, например, следующего, но я думаю, что ваше текущее решение намного точнее и надежнее.

>>> l = ['1','2','3','rt4','rt5']
>>> l = list(map(lambda s : (s.isdigit() or (s[0] == '-' and s[1:].isdigit())) and int(s) or s, l))
>>> l
[1, 2, 3, 'rt4', 'rt5']

Это не будет правильно отлавливать строки, такие как '1.0' или ' 1', но это должно делать то, что вы хотите, в две строки.

0
Jake Conkerton-Darby 29 Авг 2017 в 11:23

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

l = ['1','2','3','rt4','rt5']
l = [int(each) if each.isdigit() else each for each in l]
print l
0
Venkat 29 Авг 2017 в 11:21