【问题标题】:Extracting individual numbers from string (python)从字符串中提取单个数字(python)
【发布时间】:2019-10-08 09:56:23
【问题描述】:

我有一个很长的代码,例如 545362783,并且想将包含的数字相加并相乘,例如 (1*5)+(2*4)+(3*5)+(4*3)+(5*6) 等。

是否有一个简单的解决方案可以将它们作为整数,以便我可以在数学中使用它们。 非常感谢!

【问题讨论】:

  • 有一个简单的解决方案,但它并不可靠。为了使其健壮,您可能需要一个解析器。你可以使用 Python 的 ast 模块,但它不仅仅解析数学:>>> ast.dump(ast.parse('(1 + 2) + (3 + 4)')) 会给你一个解析的表达式:'Module(body=[Expr(value=BinOp(left=BinOp(left=Num(n=1), op=Add(), right=Num(n=2)), op=Add(), right=BinOp(left=Num(n=3), op=Add(), right=Num(n=4))))])'
  • 您好,欢迎加入 StackOverflow。由于您的问题通常很清楚,因此一个更有条理的问题,尤其是一个易于复制的示例会很有帮助。

标签: python-3.x


【解决方案1】:

一种方法:

s = '545362783'

a = sum(x * int(c) for x, c in zip(range(1, len(s) + 1), s))
print(a)
# 222

发生的事情如下:

  • s 只是一个字符串,所以循环遍历它会得到每个字符
  • range(1, len(s) + 1) 将给出从 1s 长度的整数
  • zip() 对其参数进行分组,以便for 循环同时产生1'5'(等)
  • 然后,包含字符的c 被转换为int
  • 最后全部相乘,加起来就是sum()

同样可以更有效地完成enumerate()(充分利用start 参数,similarly to what is done in @shahaf's answer):

a = sum(x * int(c) for x, c in enumerate(s, 1))

这与上面的基本相同,但更优雅(可能也更快)。 enumerate() 的行为只是产生一个伴随被循环对象的索引。

【讨论】:

  • 这是我更喜欢的解决方案,不过我不知道我不需要在总和中进行列表理解。
  • sum() 可以使用生成器,这样可以避免创建不必要的中间 list
  • 嘿。奇迹般有效。除了最后一个之外,是否仍然可以遍历每个数字。假设我有 10 个字符,但我只想乘以其中的 9 个。感谢您的帮助!
  • 只需对列表进行切片: sum(a * int(b) for a, b in enumerate(s[:-1], 1)) 应该可以工作。
【解决方案2】:

你可以写一个相当简单的方法来做,像这样

num_str = "545362783"
total = 0;
for idx, num in enumerate(num_str, 1):
  total += idx * int(num)

【讨论】:

  • enumerate() 中很好地使用了start 参数。
【解决方案3】:

尝试解压

s = '545362783'
# --> to map each character of the string to a list:
print([*s])
['5', '4', '5', '3', '6', '2', '7', '8', '3']

# --> to map each character of the string directly to a list of integers:
# (thanks Mykola Zotko for the comment!)
print(list(map(int, s)))
[5, 4, 5, 3, 6, 2, 7, 8, 3]

更多关于解包操作符 * 参见例如here.

【讨论】:

  • @MeMyself:在这种情况下,它更像是从可迭代的字符串中获取单个元素的通用解决方案。对于您在问题中提到的具体计算,我认为norok2's answer 非常好。
  • 试试list(map(int, s))
  • @MykolaZotko:感谢您的评论,进行了编辑;-)
【解决方案4】:

这是解决方案。希望对你有帮助:

a = list(str(545362783))
count = 1
c = []
for i in a:
    b = count * int(i)
    c.append(b)
    count = count + 1

sum_of_a = sum(c)
print(sum_of_a)

输出:

222

【讨论】:

    【解决方案5】:
    def count_substring(string):
        string = '545362783'
        multi = []
        for i in range(0, len(string)):
           multiplied = int(i+1) * int(string[i])
           multi.append(multiplied) 
    
    print (multi)
    print (sum(multi))
    

    你可以试试这个。

    输出:

    [5、8、15、12、30、12、49、64、27]

    222

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      相关资源
      最近更新 更多