【问题标题】:How to prepare a list containing a mix of integers, float and strings using lambda function?如何使用 lambda 函数准备包含整数、浮点数和字符串的列表?
【发布时间】:2023-03-08 01:20:01
【问题描述】:

我正在尝试转换:

data = 'A|B|2|D|0.3|5|kg|1.69|m'

to list
['A','B',2,'D',0.3,5,'kg',1.69,'m'] 
# where every element is the type it should be (not all are strings)

我试过了:

data_list = da.split('|')
print(da_list)
['A', 'B', '2', 'D', '0.3', '5', 'kg', '1.69', 'm'] # every element is string

#Then

data_list02 = map(lambda x: (int(x) or float(x)) if x.isdigit() else str(x), data_list)
print (data_list02)
['A', 'B', 2, 'D', '0.3', 5, 'kg', '1.69', 'm'] # float are retained as str

我尝试的 lambda 解决方案有什么问题?我不想写另一个def function

【问题讨论】:

  • 它应该是的类型听起来不太好。而0.3 不是数字
  • 对于初学者,'0.3'.isdigit() == False,因此不会发生float 转换...
  • 嗯。这很有启发性。我该如何解决这个问题?有什么想法吗?
  • 你可以尝试使用ast.literal_eval
  • @everestial007,科学计数法中的数字怎么样,比如1.00e-05?应该如何治疗?

标签: python list lambda type-conversion list-comprehension


【解决方案1】:

您可以使用 ast 模块中的 literal_eval 和自定义方法,如下例所示:

from ast import literal_eval as le

def format(data, sep= '|'):
    for k in data.split(sep):
        try:
            yield le(k)
        # Or:
        # You can escape any kind of odd data by using:
        # except Exception:
        #     yield k
        # Or list them then yield k
        except ValueError:
            yield k
        # Thanks to @RomanPerekhrest's comment
        except SyntaxError:
            yield k

data = 'A|B|2|D|0.3|5|kg|1.69|m'
final = list(format(data))
print(final)

输出:

['A', 'B', 2, 'D', 0.3, 5, 'kg', 1.69, 'm']

PS:我没有在大量数据中测试此方法,如果失败,请留下您的反馈。

【讨论】:

  • ValueError: malformed node or string: <_ast.Name object at 0x00000000036450B8>
  • 用什么样的数据?使用我的'A|B|2|D|0.3|5|kg|1.69|m' 效果很好。你能告诉我它失败的哪种数据吗?
  • data = 'A|B|2|D|0.3|5|kg|1.69|m' data_list = list(map(lambda x: ast.literal_eval(x), data.split('|')))
  • 尝试处理这个序列data = 'A|B|2|D|0.3|5|kg|1.69|m|*10e'。你看到了什么?
  • 我已经问过了。让我们看看 OP 会如何回应
【解决方案2】:

你可以使用:

data_List=[int(x) if x.isdigit() else float(x) if x.replace(".", "", 1).isdigit() else str(x) for x in data]

例子:

>>> data = 'A|B|2|D|0.3|5|kg|1.69|m'
>>> data=data.split('|')
>>> data
['A', 'B', '2', 'D', '0.3', '5', 'kg', '1.69', 'm']
>>> data_List=[int(x) if x.isdigit() else float(x) if x.replace(".", "", 1).isdigit() else str(x) for x in data]
>>> data_List
['A', 'B', 2, 'D', 0.3, 5, 'kg', 1.69, 'm']

编辑

如果你有负整数或浮点数使用:

data_List=[int(x) if x.lstrip('-').isdigit() else float(x) if x.lstrip('-').replace(".", "", 1).isdigit() else str(x) for x in data]

例子:

>>> data = 'A|B|2|D|0.3|-5|kg|-1.69|m'
>>> data=data.split('|')
>>> data_List=[int(x) if x.lstrip('-').isdigit() else float(x) if x.lstrip('-').replace(".", "", 1).isdigit() else str(x) for x in data]
>>> data_list
['A', 'B', 2, 'D', 0.3, -5, 'kg', -1.69, 'm']

【讨论】:

  • 嗯,为什么不将-5 转换为int-1.0 转换为float
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2013-08-04
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多