【问题标题】:List of list, converting all strings to int, Python 3列表列表,将所有字符串转换为 int,Python 3
【发布时间】:2017-10-12 14:20:42
【问题描述】:

我正在尝试将大列表中小列表的所有元素转换为整数,所以它应该如下所示:

current list:
list = [['1','2','3'],['8','6','8'],['2','9','3'],['2','5','7'],['5','4','1'],['0','8','7']]


for e in list:
    for i in e:
        i = int(i)

new list:
list = [[1,2,3],[8,6,8],[2,9,3],[2,5,7],[5,4,1],[0,8,7]]

谁能告诉我为什么这不起作用并向我展示一种有效的方法?谢谢!

【问题讨论】:

  • 通过分配i = int(i),你覆盖了变量i中的引用,而不是列表中的值
  • @Mirac7 谢谢!
  • 如果我只想转换每个列表中的第三个值怎么办? [['1','2',3],['8','6',8],['2','9',3],['2','5',7],[ '5','4',1],['0','8',7]]

标签: python list python-3.x int type-conversion


【解决方案1】:

您可以使用嵌套列表推导:

converted = [[int(num) for num in sub] for sub in lst]

我也将list重命名为lst,因为list是列表类型的名称,不建议用于变量名。

【讨论】:

    【解决方案2】:
    for e in range(len(List)):
        for p in range(len(List[e])):
            List[e][p] = int(List[e][p])
    

    或者,您可以创建一个新列表:

    New = [list(map(int, sublist)) for sublist in List]
    

    【讨论】:

      【解决方案3】:

      嵌套列表推导是最好的解决方案,但您也可以考虑使用 lambda 函数进行映射:

      lista = [['1','2','3'],['8','6','8'],['2','9','3'],['2','5','7'],['5','4','1'],['0','8','7']]
      
      new_list = map(lambda line: [int(x) for x in line],lista)
      # Line is your small list.
      # With int(x) you are casting every element of your small list to an integer
      # [[1, 2, 3], [8, 6, 8], [2, 9, 3], [2, 5, 7], [5, 4, 1], [0, 8, 7]]
      

      【讨论】:

        【解决方案4】:

        简而言之,你并没有变异lst

        for e in lst:
            for i in e:
                # do stuff with i
        

        相当于

        for e in lst:
            for n in range(len(e)):
                i = e[n]  # i and e[n] are assigned to the identical object
                # do stuff with i
        

        现在,你对i做的“东西”是否反映在原始数据中,取决于它是否是对象的突变,例如

        i.attr = 'value'  # mutation of the object is reflected both in i and e[n]
        

        但是,字符串类型(strbytesunicode)和int 在 Python 中是不可变的,变量赋值不是突变,而是重新绑定操作。

        i = int(i)  
        # i is now assigned to a new different object
        # e[n] is still assigned to the original string
        

        所以,你可以让你的代码工作:

        for e in lst:
            for n in range(len(e)):
                e[n] = int(e[n])
        

        或使用更短的理解符号:

         new_lst = [[int(x) for x in sub] for sub in lst]
        

        但是请注意,前者会改变现有的list 对象lst,而后者会创建一个新对象new_lst,而原始对象保持不变。您选择哪一个将取决于您的程序的需要。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-14
          • 1970-01-01
          • 2016-04-14
          • 2018-04-24
          • 1970-01-01
          • 2018-04-08
          相关资源
          最近更新 更多