Условно преобразовать строку в int

В строке data=[int(x) if x else None for x in line.replace("\n","").split(",")] ниже я хотел бы сохранить строковые значения в виде строки вместо того, чтобы генерировать исключение, если встречается значение, которое нельзя преобразовать в int. Есть ли какие-нибудь элегантные способы сделать это? Например, если у вас есть на заданной строке 9327,Garlic Powder,104,13, тогда данные будут [9327, "Garlic Powder", 104, 13]

Рик

file = open(file_path, 'r') 

# get headers
try:
    header=next(file).replace("\n","").split(",")
except:
    raise Exception("The file {} is empty.".format(file.file_path))

count = 0 # to count number of rows

# loop through file and process data
for line in file:
    try:
        data=[int(x) if x else None for x in line.replace("\n","").split(",")]
    except:
        raise Exception("The file {} contains invalid data.".format(file.file_path))
    count += 1
    for f in callback_array:
        f(header,data)

Это нормально, если мы попытаемся привести его к типу int и, основываясь на результате, вернуть либо строку, либо целое число @Rik?

Devesh Kumar Singh 28.05.2019 07:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
623
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете определить функцию, которая проверяет, может ли строка быть проанализирована до целого числа. Если это возможно, верните целое число, иначе верните строку

def parse(s):

    #If string can be parsed as integer, return integer
    try:
        num = int(s)
        return num
    except:
        pass
    #Else return string
    return s

line = '9327,Garlic Powder,104,13'
data=[parse(x) for x in line.replace("\n","").split(",")]

print(data)

Результат будет

[9327, 'Garlic Powder', 104, 13]

Вы можете сохранить свой oneliner, используя isnumeric:

data=[int(x) if x and x.isnumeric() else x for x in line.replace("\n","").split(",")]

Это не будет работать для строк, содержащих отрицательные целые числа, например -1

Devesh Kumar Singh 28.05.2019 07:58

Да, я просто опираюсь на его примерные данные. Если также включены отрицательные числа, вместо этого следует использовать функцию, подобную вашей.

Henry Yik 28.05.2019 08:02

Попробуй это,

>>> def type_convert(var):
    if var.isnumeric():
        return int(var)
    elif isinstance(var, str):
        return var
    else:
        return None


>>> [type_convert(i) for i in a]
[9327, 'Garlic Powder', 104, 13]
>>> new = [type_check(i) for i in a]
>>> [type(n) for n in new]
[<class 'int'>, <class 'str'>, <class 'int'>, <class 'int'>]

Другие вопросы по теме