【问题标题】:Python: List of lists of integers to absolute value to single numberPython:整数列表到绝对值到单个数字的列表
【发布时间】:2010-12-27 06:50:52
【问题描述】:

如果我有一个整数列表说:

[['12' '-4' '66' '0'], ['23' '4' '-5' '0'], ['23' '77' '89' '-1' '0']]]

我想将数字转换为它们的绝对值,然后转换为单个数字,因此输出将是:

1246602345023778910

【问题讨论】:

  • 你的例子中的数字实际上是字符串,这是故意的吗?
  • 这是您的问题stackoverflow.com/questions/1914883,还是您之前问的stackoverflow.com/questions/1909619?如果缺少的部分仅仅是使用 abs() 来获取绝对值,我认为您需要阅读 Python 教程并查看内置函数。
  • 在阅读了您的其他问题后(感谢 peter),我觉得更优雅的文件解析算法也可以解决您的问题。如果你只对数字感兴趣,为什么不只解析输入的数字呢?
  • 我想这是你第四次问这个问题了。

标签: python list mapping integer absolute


【解决方案1】:

您所显示的是(可能)一个字符串列表的列表,并且语法非常奇特——子列表以普通逗号显示,但在每个子列表中只有文字字符串,它们之间有空格.如果你真的把它输入到 Python 中,你会得到一个列表,其中每个子列表都包含一个字符串——Python 和 C 一样,在编译时连接字符串文字,这些文字只是与中间的空格并列。

假设您确实打算有几个字符串的子列表,并带有适当的逗号,并且您提到“数字列表”(这不是您所拥有的 - 您有字符串列表!-)只是小意外,类似:

''.join(c for L in thelist for c in L).replace('-', '')

可能是最好的——只在字符串级别操作(所以,用空替换破折号,而不是使用abs),因为无论如何你确实需要字符串来进行连接/连接。

如果您热衷于以最复杂的方式进行操作,

''.join(str(abs(int(c))) for L in thelist for c in L)

也可以(并且更符合您的要求),但第一个想法更好。

【讨论】:

    【解决方案2】:

    你上面给出的是一个字符串列表。

    我建议采用两遍方法:

    1. 从字符串中获取整数并取其绝对值:

      [ abs(int(s)) for s in list ]

    2. 将这些数字组合成一个字符串,然后变成一个整数

      ''.join([ ''.join(x) for x in listoflists ])

    当你结合这两种方法时,你会得到:

    >>> listoflists = [['12','-4','66','0'],['23','4','-5','0'],['23','77','89','-1','0']]
    >>> int(''.join([ ''.join([ str(abs(int(s))) for s in list ]) for list in listoflists ]))
    1246602345023778910L
    

    虽然它不好读,但您可能希望将其分开,以便对可能难以理解它的人更有意义。

    注意:如果你确实有一个整数列表,正如你所说,那么它会容易得多:

    >>> listofints = [12,-4,66,0,23,4,-5,0,23,77,89,-1,0]
    >>> int(''.join( [ str(abs(x)) for x in listofints ]))
    1246602345023778910L
    

    【讨论】:

      【解决方案3】:

      您可以在这里使用 itertools.chain 来摆脱嵌套,连接数字字符串,删除“-”符号,然后将它们变成数字。

      import itertools
      mylist = [['12' '-4' '66' '0'], ['23' '4' '-5' '0'], ['23' '77' '89' '-1' '0']]
      num = int( ''.join(itertools.chain(*mylist)).replace('-','') )
      

      编辑:我之前错过了 abs 要求。
      第二次编辑:使用了替换,它可能比 str(abs(int(n))) 更有效,而且也不那么笨拙(礼貌:亚历克斯的回答)

      【讨论】:

        【解决方案4】:

        我是Python新手,如果有更有效的方法请见谅:)

        #!/usr/bin/python
        
        str = ''
        lists = [['12' '-4' '66' '0'], ['23' '4' '-5' '0'], ['23' '77' '89' '-1' '0']]
        
        for list in lists:
          str += list[0].replace('-', '')
        
        print int(str)
        

        【讨论】:

        • 你为什么要单独替换列表[0]?
        • ['12' '-4' '66' '0'] 不是列表中的列表。它是一个带有串联字符串的列表。因此,您只需替换列表第一个成员中的连字符即可。
        【解决方案5】:

        正如其他答案中所指出的,您的内部列表并不像它们看起来那样“列表”。由于缺少逗号,Python 将(我认为)将它们全部连接成一个字符串,从而为您提供一个项目列表。这将与此相同:

        [['12-4660'], ['234-50'], ['237789-10']]
        

        在任何情况下,您都可以去掉所有不是数字的东西来得到结果(无论有没有逗号都可以):

        ''.join(x for x in str(mylist) if x.isdigit())
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-10-09
          • 1970-01-01
          • 2021-05-25
          • 2017-08-12
          • 2020-08-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多