【问题标题】:Convert a string that includes both characters and integers to a list in Python将包含字符和整数的字符串转换为 Python 中的列表
【发布时间】:2023-03-31 14:19:01
【问题描述】:

例如,我知道如何转换:

'1-2=3^4/5' -> [1, '-', 2, '=', 3, '^', 4, '/', 5]

但如果假设我想转换:

'12-34=56^78/90' -> [12, '-', 34, '=', 56, '^', 78, '/', 90]

那我有问题了。

我尝试了几件事情,但它从来没有完美地工作过 - 它要么有一个无法工作的边缘情况,要么存在问题。例如,我遇到的一个问题是 int 的第一个数字之后的数字被重复为新元素。

如果有人能花些时间帮助我,我将不胜感激。

提前谢谢!

编辑:感谢大家的快速解答!但是,我对编程有点陌生,因此不熟悉所使用的模块或方法。 是否可以仅使用内置函数来做到这一点?

【问题讨论】:

  • 请在您的帖子中分享您的尝试

标签: python python-3.x string list integer


【解决方案1】:

选择一些数字或非数字的简单模式就可以了

pat = re.compile(r"\d+|\D")

parts = pat.findall("1-2=3^4/5")
print(parts)  # ['1', '-', '2', '=', '3', '^', '4', '/', '5']

parts = pat.findall("12-34=56^78/90")
print(parts)  # ['12', '-', '34', '=', '56', '^', '78', '/', '90']

【讨论】:

  • @juicy 请注意,我的解决方案比您接受的解决方案快 3 倍,甚至比您之前编译模式的速度快 4 倍。结合如此轻量级的代码,我让你决定哪一个是真正的最佳答案;)
  • @azro 你说得对,只是我对编程有点陌生,因此对你所做的并不熟悉,但我看了看,只是将“解决方案”更改为帖子.再次感谢!
【解决方案2】:

使用itertools.groupby按连续数字分组(使用str.isdigit)

from itertools import groupby

s = '12-34=56^78/90'

res = ["".join(group) for k, group in groupby(s, key=str.isdigit)]
print(res)

输出

['12', '-', '34', '=', '56', '^', '78', '/', '90']

【讨论】:

  • 谢谢它的工作!是否可以只使用内置函数来做到这一点?
【解决方案3】:

另外两个答案要好得多。但如果你觉得不得不在没有任何导入的情况下这样做,这里有一个解决方案。

s = '12-34=56^78/90'

output = []
section = []
for e in s:
    try:
        e = int(e)
        section.append(e)
    except ValueError:
            output.append(''.join(map(str,section)))
            output.append(e)
            section = []
            
output.append(''.join(map(str,section)))

【讨论】:

  • @juicy 使用这个答案。
猜你喜欢
  • 2020-08-05
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 2018-09-24
  • 2021-07-23
  • 2017-07-30
  • 1970-01-01
相关资源
最近更新 更多