【问题标题】:How to prepare a list containing a mix of integers, float and strings?如何准备一个包含整数、浮点数和字符串混合的列表?
【发布时间】:2017-05-28 15:40:25
【问题描述】:

假设我有数据

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

我想使用 split('|') 将其转换为列表,但我得到了所有值都转换为字符串的列表。我在 SE 上没有看到任何类似的问题。

我怎样才能得到类似的东西:

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

数据的类型在哪里(int、str 或 float)。

我不想要一个非常冗长的函数,但 用最短和最简单的方法来实现它,lambda 是否可行(我正在尝试但到目前为止没有成功)?,其他的也可以.

任何想法。

后期编辑:

我尝试通过以下方式使用 lambda:

da_list02 = map(lambda x: float(x) if type(float(x)) is float else str(x), da_list)

但是,我收到了ValueError。 ValueError:无法将字符串转换为浮点数:A

elselambda function 部分不应该覆盖它吗? lambda function 有什么问题?

【问题讨论】:

  • 你尝试将x转换成if type(float(x))中的float,所以出现异常。

标签: python regex string list lambda


【解决方案1】:

您可以使用嵌套的tryexcept

def convert(value):
    try:
        return int(value)
    except ValueError:
        try:
            return float(value)
        except ValueError:
            return value

data = 'A|B|2|D|0.3|5|kg|1.69|m'
data_list = [convert(value) for value in data.split('|')]
print(data_list)

【讨论】:

    【解决方案2】:

    您可以尝试将字符串转换为浮点数。

    data = 'A|B|2|D|0.3|5|kg|1.69|m'
    
    def transform(x):
        try:
            return float(x)
        except ValueError:
            return x
    
    [transform(x) for x in data.split('|')]
    

    输出:

    ['A', 'B', 2.0, 'D', 0.3, 5.0, 'kg', 1.69, 'm']
    

    【讨论】:

    • 这使得 5 成为浮点数,而不是整数。
    【解决方案3】:

    你可以试试这个:

    import string
    data = 'A|B|2|D|0.3|5|kg|1.69|m'
    
    new_data = data.split("|")
    
    final_list = []
    
    for i in new_data:
       if i[0] in string.ascii_uppercase or i[0] in string.ascii_lowercase:
          final_list.append(i)
    
       elif i.isdigit():
          final_list.append(int(i))
    
       else:
          final_list.append(float(i))
    

    另外,如果你想要一个简单的列表理解,你可以使用这个:

    print [i if i[0] in string.ascii_lowercase or i[0] in string.ascii_uppercase else int(i) if i.isdigit() else float(i) for i in new_data]
    

    【讨论】:

      【解决方案4】:

      这是我使用带有锚点和map()的正则表达式的解决方案:

      import re
      
      data = 'A|B|2|D|0.3|5|kg|1.69|m'
      
      def convert(item):
          if re.match(r'-?\d+$', item):
              return int(item)
          elif re.match(r'-?\d+\.\d+$', item):
              return float(item)
          else:
              return item
      
      elements = map(convert, data.split('|'))
      print(elements)
      # ['A', 'B', 2, 'D', 0.3, 5, 'kg', 1.69, 'm']
      

      【讨论】:

        【解决方案5】:

        另一种方法是使用正则表达式。对不起,我使用了一个函数。

        import re
        
        data = 'A|B|2|D|0.3|5|kg|1.69|m'
        
        data_list = data.split('|')
        
        print('data_list: ', data_list)
        
        def parse(item):
            if re.search("\d+\.\d+", item):
                return float(item)
            elif re.search("\d+", item):
                return int(item)
            else:
                return str(item)
        
        
        result = [parse(item) for item in data_list]
        
        print('result: ', result)
        
        for item in result:
            print('{}, type: {}'.format(item, type(item)))
        

        【讨论】:

          【解决方案6】:

          Lambda 不适用于这种情况,因为它们仅限于一个衬里。在这种情况下,您需要一些条件。

          你可以有一个简短的实用函数,它接受一个字符串,推断类型并返回推断的类型。此解决方案适用于整数、浮点数和字符串。

          def set_type(s):
              """(str)->infered type.
              Takes a string, inferes the type and returns either a string, int or float.
              """
              if s.isnumeric():
                  return int(s)
              if s.count(".") == 1 and "".join([c for c in s if c!="."]).isnumeric():
                  return float(s)
              return s
          

          现在函数可以映射到一个列表中:

          >>> data = 'A|B|2|D|0.3|5|kg|1.69|m'
          >>> lst = lst = data.split("|")
          >>> list(map(set_type, lst))
          ['A', 'B', 2, 'D', 0.3, 5, 'kg', 1.69, 'm']
          >>> data_list = list(map(set_type, lst))
          >>> list(map(type, data_list))
          [str, str, int, str, float, int, str, float, str]
          

          干杯。

          【讨论】:

            猜你喜欢
            • 2023-03-08
            • 1970-01-01
            • 1970-01-01
            • 2021-09-24
            • 1970-01-01
            • 2020-01-13
            • 1970-01-01
            • 2020-09-20
            • 2021-12-22
            相关资源
            最近更新 更多