【问题标题】:Subtraction of one string values from another string values从另一个字符串值中减去一个字符串值
【发布时间】:2017-12-13 15:57:57
【问题描述】:

我有两个字符串,分别称为 string1string2。两者都由 6 个不同的数字组成。

我想在 Python 中做的是从 string2 中的值中减去 string1 中的值。我该怎么做呢?我猜这涉及一个 for 循环,因为我只想从string2 中的第一个值中减去string1 中的第一个值。并从string2 中的第二个值等中减去string1 中的第二个值。

所以如果字符串 1 得到了数字

2 5 8 9 6 3

字符串 2 得到了数字

2 3 5 9 3 2

我想用“string1”减去“string2”得到

0 2 3 0 3 1

有什么建议吗?

【问题讨论】:

  • 你的字符串真的像'2 5 8 9 6 3''258963'吗?因为这改变了游戏很多..

标签: python


【解决方案1】:

您可以通过split()zip()join() 实现此目的:

" ".join([str(int(a) - int(b)) for a, b in zip(s1.split(), s2.split())])

【讨论】:

    【解决方案2】:

    在@pault 答案的基础上,您可以有以下变体(删除了对split() 的调用,添加了一个条件):

    "".join([str(int(a) - int(b)) if a != ' ' else ' ' for a, b in zip(s1, s2)])
    

    这只是一种更好的做法:

    " ".join([str(int(a) - int(b)) for a, b in zip(s1.replace(' ', ''), s2.replace(' ', ''))])
    

    后者可能更具可读性。

    【讨论】:

    • 我想到了这里的所有答案,这是我最喜欢的。我唯一的抱怨是它为了简洁而牺牲了一点可读性。不过很聪明。
    • @RagingRoosevelt 是的。也许现在变得更清楚了。
    • @RagingRoosevelt :此答案假定长度相等的数字(第一个变体)或单个数字(更高级的方式)。
    • @Faibbus 它还假设要回答的问题是所问的问题,而不是它的所有可能变体。
    • @Faibbus,最喜欢的!= 最好的
    【解决方案3】:

    你可以使用正则表达式:

    import re
    s1 = '2 5 8 9 6 3'
    s2 = '2 3 5 9 3 2'
    new_string = ' '.join(str(a-b) for a, b in zip(map(int, re.findall('\d+', s1)), map(int, re.findall('\d+', s2))))
    

    输出:

    '0 2 3 0 3 1'
    

    【讨论】:

    • 我最喜欢的一位教授说过一句话:“不要用炮弹杀死苍蝇”。
    【解决方案4】:
    s1 = '2 5 8 9 6 3'
    s2 = '2 3 5 9 3 2'
    l1 = [int(x) for x in s1.split()]
    l2 = [int(x) for x in s2.split()]
    r1 = [v1 - v2 for v1, v2 in zip(l1, l2)]
    

    .split() 根据空格出现的位置将你的字符串拆分成一个列表(尽管你可以给它提供一个参数来告诉它拆分到别的东西上)。

    [int(x) for x in s1.split()] 是一个列表理解。这是一个单行循环,它为列表中的每个值(拆分字符串)做一些事情。我们需要将拆分字符串中的值转换为整数。

    zip(l1, l2) 获取两个列表中的值并将它们配对。您需要列表具有相同数量的元素才能正常工作(我们这样做)。从这里开始,我们使用另一个列表推导来提取成对的值,然后取其差。

    edit (ty danihp):如果您需要将结果作为字符串,您可以使用' '.join([str(x) for x in r1]) 连接列表中的值(这使用空格来分隔列表中的元素)。

    【讨论】:

      【解决方案5】:

      一步一步:

      s1 = '2 5 8 9 6 3'
      s2 = '2 3 5 9 3 2'
      
      s3 = [int(x) for x in s1.split()] # split and convert to int
      s4 = [int(x) for x in s2.split()] # split and convert to int
      
      s5 = [] # result
      for idx in range(0,len(s3)): # length are equal so this is ok
             s5.append(s3[idx]-s4[idx]) # put into result
      
      rv = " ".join([str(x) for x in s5]) # join result to string
      
      print(s1)
      print(s2)
      print(s3)
      print(s4)
      print(s5)
      print(rv)
      

      输出:

      2 5 8 9 6 3
      2 3 5 9 3 2
      [2, 5, 8, 9, 6, 3]
      [2, 3, 5, 9, 3, 2]
      [0, 2, 3, 0, 3, 1]
      0 2 3 0 3 1
      

      【讨论】:

        【解决方案6】:

        由于键入了python,因此您无法减去字符串:您必须将每个字符串转换为整数列表,然后减去每个元素。

        你可以只用一个循环来做到这一点:

        s1 = '2 5 8 9 6 3'
        s2 = '2 3 5 9 3 2'
        
        list_diff = [int(x2) - int(x1) for x1, x2 in zip(s1.split(), s2.split())]
        
        # or if you want the result as a string:
        list_diff = [str(int(x1) - int(x2)) for x1, x2 in zip(s1.split(), s2.split())]
        result = " ".join(list_diff)
        

        【讨论】:

        • 窃取@pault 风头的方法。并提供一个错误的解决方案 (TypeError: sequence item 0: expected str instance, int found)
        • 您必须将list_diff 的元素转换为str 以获得join()
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-15
        • 2019-07-27
        • 1970-01-01
        • 2013-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多