【问题标题】:Why does the tuple() function in python return to many parentheses为什么python中的tuple()函数返回很多括号
【发布时间】:2019-06-18 01:10:26
【问题描述】:

为了清楚起见,我正在尝试将元组转换为字符串,然后将字符串转换回元组而不进行任何更改,例如额外的括号。

当我使用它时

#Creates and prints an tuple
tuple_list = (480L, 640L, 3L)
print tuple_list

它打印(480L, 640L, 3L)

但是当我使用时

#Converts the tuple to string and then prints the tuple form of the string
stri = str(tuple_list)
print tuple([stri])

它打印('(480L, 640L, 3L)',)

为什么不打印(480L, 640L, 3L),如何让它打印这个?

【问题讨论】:

  • 因为后者是3个长整数的元组,而前者是包含一个字符串的元组。
  • @meowgoesthedog 我的问题有误,但我更新了? awsner 还是一样的吗?如果是这样,我该如何让它打印出我想要的结果
  • 只是print stri。当您尝试打印非字符串对象时,无论如何都会隐式进行字符串转换。
  • @meowgoesthedog 不,我需要元组形式。我有一个自动将其转换为字符串的程序,我需要元组形式,但如果我尝试将其转换回来,我会遇到这个问题。请帮我得到我想要的结果
  • 那么您应该编辑您的问题以明确您的目标是将字符串转换回元组

标签: python string python-2.7 tuples


【解决方案1】:

那么就这样做吧:

`print(stri)`

为了稍后将此字符串转换为元组,您必须像这样使用模块文字 eval:

from ast import literal_eval

print(literal_eval(stri))

【讨论】:

  • 糟糕,我的问题有问题我想打印 stri 的元组形式,我编辑了我的问题,所以请编辑你的 awsner
  • 立即查看! @hetijav
  • @meowgoesthedog 请不要建议使用eval - 这是非常不安全的,特别是当 eval 的字符串显然来自外部世界时。这里的正确解决方案是ast.literal_eval(),这主要是安全的。
  • @brunodesthuilliers,他给我的遮阳篷工作,ast.literal_eval() 给了我NameError: name 'ast' is not defined
  • @hetijav 像所有模块一样,ast 必须导入。虽然它“有效”,但eval 将无条件地执行您传递的任何内容,这是让您的代码向脚本小子开放的可靠方法。实际上非常非常很少有比eval更好的解决方案(实际上我还没有找到...)
【解决方案2】:

这个:

stri = str(tuple_list)
print tuple([stri])

首先创建一个tuple_list的字符串表示,然后创建一个包含这个字符串作为单个元素的列表,然后从这个列表中构建一个tuple(与单个元素具有相同的字符串),最后打印这个表示元组。如果你把它分解,这就是这样做的(print 在每个步骤中添加语句以使事情更清晰):

stri = str(tuple_list)
print("stri: '{}'".format(repr(stri)))
lst = [stri]
print("lst: '{}'".format(repr(lst)))
tup = tuple(lst)
print("tup: '{}'".format(repr(tup)))
print(tup)

我需要元组形式,但如果我尝试将其转换回来,我会遇到这个问题。

然后你想要ast.literal_eval()

>>> import ast
>>> tup = ("a", "b", "c")
>>> stri = str(tup)
>>> stri
"('a', 'b', 'c')"
>>> result = ast.literal_eval(stri)
>>> result
('a', 'b', 'c')

注意:请注意,这仅适用于包含文字常量的元组。

附带说明:当使用print 来检查对象时,请使用print repr(obj),而不是print obj,这样您可以获得对象的正确内部表示。

【讨论】:

  • NameError: name 'ast' is not defined
【解决方案3】:

您并没有完全清楚自己想要什么。你认为stri = str(tuple_list) 做了什么?我怀疑你想要的是将元组的每个元素 单独 转换成一个字符串:

>>> stri = tuple(str(element) for element in tuple_list)

然后给出我认为你想要的元组:

>>> print stri

('480', '640', '3')

(另请注意,我认为您使用的是 Python 2.x 语法来处理长整数,这可能不是必需的。您可能是从一个相当古老的资源中学习 Python。)

(您的版本将整个元组转换为单个字符串。)

【讨论】:

    【解决方案4】:

    这一行:

    print tuple_list
    

    将元组转换为字符串表示形式并呈现在屏幕上。

    (480L, 640L, 3L)
    

    如果你打印字符串文字“(400”,像这样:print "(400" 那么你会看到

    (480
    

    在屏幕上。同样,元组(480L, 640L, 3L) 的字符串表示是字符串"(480L, 640L, 3L)"

    这一行:

    stri = str(tuple_list)
    

    还创建(480L, 640L, 3L) 的字符串表示并将其存储在变量stri 中。如果此时您执行print stri,您将获得与原始输出相同的输出。但是你的代码会这样做:

    print tuple([stri])
    

    这在一行中完成了三件事。首先,它创建一个包含一个元素[stri] 的列表。然后它调用tuple() 将1 元素列表转换为1 元素元组(stri,)。最后,它调用 print 将您的 1 元素元组转换为该元组的字符串表示形式:"('(480L, 640L, 3L)',)" 并打印它。这回答了您问题的第一部分。

    很明显,您期望stri = str(tuple_list) 做一些其他事情。但是从您的问题中不清楚您期望什么输出。问题是“(480L, 640L, 3L):我如何让它打印这个?”但是您已经知道答案,因为正如您的问题所说,这是print tuple_list 的输出。那么你真正期望的输出是什么?

    【讨论】:

    • 我不能在我正在创建的程序中使用 tuple_list,我唯一可以使用的是 stri。
    • 然后print 它没有复杂的转换。
    【解决方案5】:

    如果要将元素类型更改为字符串。

    tuple(map(str, a))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-08
      • 2016-04-30
      • 2011-05-24
      • 2016-06-04
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多