【问题标题】:How to convert strings into integers?如何将字符串转换为整数?
【发布时间】:2010-10-13 03:09:53
【问题描述】:

我有一个来自 MySQL 查询的元组,如下所示:

T1 = (('13', '17', '18', '21', '32'),
      ('07', '11', '13', '14', '28'),
      ('01', '05', '06', '08', '15', '16'))

我想将所有字符串元素转换为整数,然后将它们放回列表列表中:

T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]

我尝试使用eval 实现它,但还没有得到任何体面的结果。

【问题讨论】:

标签: python string integer


【解决方案1】:

int() 是 Python 标准内置函数,用于将字符串转换为整数值。你用一个包含数字的字符串作为参数调用它,它返回转换为整数的数字:

>>> int("1") + 1
2

如果您知道列表的结构 T1(它只包含列表,只有一层),您可以在 Python 3 中执行此操作:

T2 = [list(map(int, x)) for x in T1]

在 Python 2 中:

T2 = [map(int, x) for x in T1]

【讨论】:

  • 为什么不T2 = map(lambda lol: map(int, lol), T1)?无论是地图理解还是列表理解,都是愚蠢的;)
  • @flyingsheep 双地图对我来说似乎很愚蠢,这似乎很好。
  • 如何删除 Python 2 示例(因为 Python2 的生命周期结束)?
  • @flyingsheep map(lambda) 也很傻 ;) 列表理解更自然,更易于阅读。
  • @Alisso 我把它移低了。旧版 Python 2 代码仍在使用中,无论如何,不​​要担心从答案中删除内容,除非它使情况变得更糟。
【解决方案2】:

您可以通过列表推导来做到这一点:

T2 = [[int(column) for column in row] for row in T1]

内部列表解析 ([int(column) for column in row]) 从 row 中的一系列 int 对象(如十进制字符串)构建 listints。外部列表推导 ([... for row in T1])) 构建了应用于 T1 中每个项目的内部列表推导结果的列表。

如果任何行包含int 无法转换的对象,则代码 sn-p 将失败。如果要处理包含非十进制字符串的行,则需要一个更智能的函数。

如果您知道行的结构,则可以将内部列表推导式替换为对行的函数的调用。例如。

T2 = [parse_a_row_of_T1(row) for row in T1]

【讨论】:

    【解决方案3】:

    我宁愿只使用理解列表:

    [[int(y) for y in x] for x in T1]
    

    【讨论】:

      【解决方案4】:

      不要输入int( ),而是输入float( ),这样您就可以使用小数和整数。

      【讨论】:

      • 你能解释一下你回答的更多细节吗?
      【解决方案5】:

      到目前为止,我同意每个人的回答,但问题是如果你没有所有整数,它们会崩溃。

      如果你想排除非整数,那么

      T1 = (('13', '17', '18', '21', '32'),
            ('07', '11', '13', '14', '28'),
            ('01', '05', '06', '08', '15', '16'))
      new_list = list(list(int(a) for a in b) for b in T1 if a.isdigit())
      

      这只会产生实际数字。我不使用直接列表推导的原因是因为列表推导泄露了它们的内部变量。

      【讨论】:

      • isdigit 很棘手,试试-1int(<str>) 是通过try/except 进行检查的方式。
      【解决方案6】:

      试试这个。

      x = "1"
      

      x 是一个字符串,因为它有引号,但它里面有一个数字。

      x = int(x)
      

      因为x里面有数字1,我​​可以把它变成一个整数。

      要查看字符串是否为数字,您可以这样做。

      def is_number(var):
          try:
              if var == int(var):
                  return True
          except Exception:
              return False
      
      x = "1"
      
      y = "test"
      
      x_test = is_number(x)
      
      print(x_test)
      

      它应该打印到 IDLE True 因为 x 是一个数字。

      y_test = is_number(y)
      
      print(y_test)
      

      它应该打印为 IDLE False,因为 y 不是数字。

      【讨论】:

      • 您的 is_number 函数错误。 '1' 不等于 1。这不是 Perl。 :-P
      • 不要重新发明轮子,使用x.isnumeric()
      【解决方案7】:
      T3=[]
      
      for i in range(0,len(T1)):
          T3.append([])
          for j in range(0,len(T1[i])):
              b=int(T1[i][j])
              T3[i].append(b)
      
      print T3
      

      【讨论】:

      • 欢迎来到 Stack Overflow!而不是只发布一段代码,请解释为什么这段代码解决了所提出的问题。没有解释,这不是答案。
      【解决方案8】:

      使用列表推导:

      t2 = [map(int, list(l)) for l in t1]
      

      【讨论】:

      • 在 python 3 中返回一个地图对象列表:(
      【解决方案9】:

      查看此功能

      def parse_int(s):
          try:
              res = int(eval(str(s)))
              if type(res) == int:
                  return res
          except:
              return
      

      然后

      val = parse_int('10')  # Return 10
      val = parse_int('0')  # Return 0
      val = parse_int('10.5')  # Return 10
      val = parse_int('0.0')  # Return 0
      val = parse_int('Ten')  # Return None
      

      你也可以检查

      if val == None:  # True if input value can not be converted
          pass  # Note: Don't use 'if not val:'
      

      【讨论】:

      • eval 是邪恶的:你应该用ast.literal_eval 替换它。
      【解决方案10】:

      Python 2 的另一个功能解决方案:

      from functools import partial
      
      map(partial(map, int), T1)
      

      不过,Python 3 会有点混乱:

      list(map(list, map(partial(map, int), T1)))
      

      我们可以用包装器解决这个问题

      def oldmap(f, iterable):
          return list(map(f, iterable))
      
      oldmap(partial(oldmap, int), T1)
      

      【讨论】:

        【解决方案11】:

        在 Python 3.5.1 中,类似这样的工作:

        c = input('Enter number:')
        print (int(float(c)))
        print (round(float(c)))
        

        Enter number:  4.7
        4
        5
        

        乔治。

        【讨论】:

          【解决方案12】:

          Python 内置函数 int(string) 和可选参数 base。

          如果您的字符串包含一个整数值,它会将其转换为相应的整数值。 但是,如果你有十进制数字作为字符串,你需要 float() 来转换它。

          用法:

          a = '22'
          b = int(a)
          

          if a = '22.22'
          b = int(a) '''will give error, invalid literal for int().'''
          b = float(a) '''will convert the string.'''
          

          【讨论】:

            【解决方案13】:

            如果它只是一个元组的元组,像rows=[map(int, row) for row in rows] 这样的东西就可以了。 (里面有一个列表理解和一个​​对 map(f, lst) 的调用,它等于 [f(a) for a in lst]。)

            Eval 不是您想要做的,以防由于某种原因在您的数据库中存在__import__("os").unlink("importantsystemfile") 之类的东西。 始终验证您的输入(如果没有其他内容,如果输入错误,将引发异常 int())。

            【讨论】:

              【解决方案14】:

              你可以这样做:

              T1 = (('13', '17', '18', '21', '32'),  
                   ('07', '11', '13', '14', '28'),  
                   ('01', '05', '06', '08', '15', '16'))  
              new_list = list(list(int(a) for a in b if a.isdigit()) for b in T1)  
              print(new_list)  
              

              【讨论】:

                【解决方案15】:

                我想分享一个这里似乎还没有提到的可用选项:

                rumpy.random.permutation(x)
                

                将生成数组 x 的随机排列。不是完全您要求的,但它是类似问题的潜在解决方案。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-01-09
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多