【问题标题】:Printing list shows single quote mark打印列表显示单引号
【发布时间】:2015-12-27 05:50:55
【问题描述】:

我有以下python代码sn-p:

LL=[]
for i in range(3):
    LL.append("a"+str(i))
print LL

输出如下:

['a0', 'a1', 'a2']

如何打印(使用print LL):

[a0, a1, a2]

即没有引号? 如果我使用以下代码:

print "[",
for i in range (len(LL)-1):
    print LL[i] + ", ",
print LL[i+1]+"]"

这打印[a0, a1, a2]

【问题讨论】:

  • 通过格式化输出。 '[{}]'.format(', '.join(LL))。容器的str() 转换不适合最终用户使用,它是一种调试工具,而不是可配置的东西。
  • 不明白为什么我被否决了,我的基本意图是有一个更清晰的输出,例如,我有一个 Point 类,它的字符串表示形式显示为 (2,3),我想要点的oprint列表为:[(2,3),(4,5)],我问错了吗?
  • 如果数字是字符串,则表示形式会为您显示附加引号,当然。
  • 我不能给你比 Bhargav Rao 已经给出的更好的建议
  • @Dr.DebasishJana 从您的 cmets 来看,我想您可能会误解。 ' 仅在列表成员是字符串或在该类的 __repr__() 中明确包含 ' 字符的另一个类时出现。使用括号时它不是“显而易见的” - 您只会得到 ' 来表示字符串值而不是其他类型。要使用您的 Point 类示例 - 如果您将 __repr__() 定义为不显示 ',那么它不会显示。这比改变显示列表的内置方式更好(不那么令人惊讶)。例如,请参阅 dpaste.com/2QWH266 我实现它的地方。

标签: python list python-2.7


【解决方案1】:

您正在打印列表的repr 格式。请改用joinformat

>>> print "[{}]".format(', '.join(LL))
[a0, a1, a2]

【讨论】:

  • 打印单个元素时还有其他方法吗?例如,如果我使用 as:print "[", for i in range (len(LL)-1): print LL[i] + ", ", print LL[i+1]+"]" 这将打印 [ a0, a1, a2]
  • @Dr.DebasishJana 不确定你在问什么。但这是首选方式。是的,您的技术也会根据需要打印它,但使用字符串函数显然是更好、更简洁的代码编写方式。
【解决方案2】:

这是一个对我有用的实用函数:

def printList(L):
    # print list of objects using string representation
    if (len(L) == 0):
        print "[]"
        return
    s = "["
    for i in range (len(L)-1):
        s += str(L[i]) + ", "
    s += str(L[i+1]) + "]"
    print s

这适用于任何对象的列表,例如,如果我们有一个点类如下:

class Point:
    def __init__(self, x_crd, y_crd):
        self.x = x_crd
        self.y = y_crd
    def __str__(self):
        return "(" + str(self.x) + "," + str(self.y) + ")"

还有一个 Point 对象列表:

L = []
for i in range(5):
    L.append(Point(i,i))
printList(L)

输出如下:

[(0,0), (1,1), (2,2), (3,3), (4,4)]

而且,它达到了我的目的。 谢谢。

【讨论】:

  • 在循环中连接字符串在 Python 中效率非常。请记住,Python 字符串是不可变的,因此每次在 for 循环中向 s 添加新字符串时,都会分配一个新的字符串对象,将子字符串复制到它,并将绑定到 @987654329 的旧字符串对象@ 被销毁。字符串.join 方法(在 Bhargav Rao 的回答中使用)以 C 速度运行,这比显式 Python 循环快得多,并且它可以分配单个目标字符串对象,因为它知道目标需要多大,所以它绕过了所有的低效率。
  • @PM2Ring,请查看这篇帖子,stackoverflow.com/questions/10043636/…,一个答案说,用 + 连接两个字符串没有任何问题。实际上它比 ''.join(a, b) 更容易阅读。
  • 我同意(大部分)该链接页面上的信息。用+ 连接两个字符串是完全可以的。事实上,从两个字符串构建一个列表,然后在该列表上调用.join 肯定比简单地使用+ 效率低。问题是当您使用 + 从几个 _ 子字符串构建字符串时。如果子字符串的数量保证很小,那么继续使用+。但是随着使用+ 的子字符串数量的增加,效率变得越来越低。因此,在具有任意大小循环的函数中执行此操作是一个坏主意。
  • 好的。我刚刚使用timeit 进行了一些速度测试。看来我的一些信息已经过时了:s += as = s + a(其中sa 是字符串)已在最新版本的CPython(标准Python)中进行了优化。所以循环中的s += a is faster 比在循环中使用append 然后在结果列表上调用.join。但是,在列表推导中使用 .join 仍然比 s += a 循环快。在现有循环上调用.join 甚至更快。但是,请参阅 Python 开发人员 Alex Martelli 的 this answer
猜你喜欢
  • 2023-03-26
  • 2015-12-09
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
相关资源
最近更新 更多