【问题标题】:Get three values from one string in python [closed]从python中的一个字符串中获取三个值[关闭]
【发布时间】:2023-03-17 06:14:03
【问题描述】:

我目前正在使用 python 进行编码,但我遇到了问题; 我有一个名为 data 的字符串和三个整数(a、b、c)。

data = "{1,2,3}"
a = 0
b = 0
c = 0

我想从数据变量中获取数字,并将它们放入 a、b、c 中,如下所示:

data = "{1,2,3}"
a = 1
b = 2
c = 3

我该怎么做?

【问题讨论】:

  • 请分享您的代码
  • Stackoverflow 的标准做法是您首先尝试自己编写代码。只有在遇到问题时才寻求帮助。
  • 如果你不尝试,其他人的机会真的很渺茫。
  • “我没有尝试过任何东西,请不要向我索要代码。没有什么可分享的” - 当这不再正确时请回来。 sopython.com/wiki/What_tutorial_should_I_read%3F
  • 在 10 秒内写一个单行词来回答一个好的问题不会伤害任何人,这就是说。为 OP 的作业写 200 行代码是另一回事。

标签: python string integer


【解决方案1】:

{1,2,3} 是有效的 Python 代码。不幸的是,在评估时它会给你一个没有顺序的set。评估字符串'{1,2,3}',我们可以得到{3,1,2}。但是我们可以将那些大括号换成括号,我们得到(1,2,3),这是一个tuple!元组保持它们的顺序。更好的是,我们可以通过赋值来解压它们:

>>> import ast
>>> data = "{1,2,3}"
>>> data = data.replace('{','(').replace('}',')') # make it look like a tuple
>>> data_as_tuple = ast.literal_eval(data) # safe "eval".  don't do: eval(data)  
>>> a, b, c =  data_as_tuple # unpack tuple via assignment
>>> a
1
>>> b
2
>>> c
3

注意:您可能不需要变量名称 abc。如果你需要带入十个数字而不是三个怎么办?然后你需要再写七个变量名吗?如果abc 都代表相同类型的事物,则最好将它们保留为tuplelist。然后,您可以为该集合指定一个名称,而不必担心为集合中的每个项目命名。然后,如果您需要对使用迭代的项目采取行动:

for item in data_as_tuple:
    print(item*3) # or whatever

致反对者:

初学者在寻找答案时往往缺乏使用的术语。如果您不知道将文本分成几部分称为拆分字符串,您会搜索什么?如果您从未听说过正则表达式,您会如何偶然发现使用它的答案?如果您不知道可以将文本评估为代码,您将如何获得ast.literal_eval

此外,OP 似乎还没有考虑集合,只是变量名 => 值。如果 OP 想要将数据提取到列表中,他的代码会更加健壮,因为他可以处理不同大小的集合。

无论如何,很难解决所有这些问题。如果问题很简单,我会向 OP 扔骨头。我假设有动力的学生会在遇到概念时收集概念。

就个人而言,我在回答不费力的家庭作业问题时划清界限。这些问题的不同之处在于,OP 几乎总是可以尝试解决多个子问题。

【讨论】:

  • 谢谢,帮了大忙! :DD
  • 请不要鼓励这个,这是问题:(i have not tried anything, idk how to do it, pls dont ask for code)
  • 嗯...downvoters 怎么了?
  • @StevenRumbalski 你有 26K 点。一些反对票根本不会伤害你。但卡罗尔也需要为他/她自己学习。将他指向 ast 工作原理或字符串替换工作原理的链接会更有帮助(在我看来)。
  • @VikashSingh:是的,在反对票开始涌入之前,我没有时间充实我的答案。现在我要离开它,把它当作荣誉徽章佩戴。 Jean-François Fabre 在解释和他提出的两种方法的缺陷方面的回答非常出色。
【解决方案2】:

您可以使用多种方法。鉴于您描述的数据格式,我建议执行以下步骤:

  1. 移除多余的大括号 ({})
  2. 将字符串分成逗号分隔的部分。
  3. 将这些部分转换为数字。

你可以在一行python中做到这一点:

>>> [int(x) for x in '{1,2,3}'[1:-1].split(',')]
[1, 2, 3]

或将其分解为步骤:

>>> s = '{1,2,3}'
>>> s = s[1:-1]
>>> ss = s.split(',')
>>> xs = [int(s) for s in ss]
>>> print(xs)
[1, 2, 3]

希望对您有所帮助。

【讨论】:

    【解决方案3】:

    我看到了很多方法来做到这一点。以下是其中 2 个:

    使用ast.literal_eval,但不能保证用括号或顺序替换花括号,在a,b,c中解包:

    import ast
    
    data = "{1,2,3}"
    
    a,b,c = ast.literal_eval(data.replace("{","[").replace("}","]"))
    
    print(a,b,c)
    

    re.findall 后跟整数转换。只提取数字,不关心分隔符。

    import re
    
    a,b,c = (int(x) for x in re.findall(r"\d+",data))
    
    print(a,b,c)
    

    当然,这两种方法都非常脆弱。如果有 2 个或 4 个项目,您会得到一个“value unpack”异常。

    【讨论】:

    • 谢谢!这有帮助!
    • 我最喜欢re.findall 解决方案。很好地注意到这些方法的脆弱性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 2016-08-03
    相关资源
    最近更新 更多