如何“正确”打印列表?


95

所以我有一个清单:

['x', 3, 'b']

我希望输出为:

[x, 3, b]

如何在python中执行此操作?

如果我这样做str(['x', 3, 'b']),我会用引号引起来,但我不希望引号。


为解释为什么列表未“正确”打印,请print(["Sam"])调用repr("Sam"),它返回'Sam'(带引号),这与您调用print("Sam")和python调用时str("Sam")返回Sam(不带引号)不同。有关更多信息,请参见Python s 之间的区别strreprstrlist
匿名

Answers:


188

在Python 2中:

mylist = ['x', 3, 'b']
print '[%s]' % ', '.join(map(str, mylist))

在Python 3中(其中print是内置函数,而不再是语法功能):

mylist = ['x', 3, 'b']
print('[%s]' % ', '.join(map(str, mylist)))

两者都返回:

[x, 3, b]

这是使用map()函数调用mylist的每个元素的str ,创建一个新的字符串列表,然后用str.join()。然后,%字符串格式运算符将字符串替换为%sin ,而不是in "[%s]"


4
谢谢您,效果很好。您能否在第二行中详细说明您的工作?我是python的新手。
Obaid

19
他正在使用该map函数调用str的每个元素mylist,创建了一个新的字符串列表,然后将其与连接为一个字符串str.join。然后,他使用%字符串格式运算符代替%sin中的字符串"[%s]"
li.davidm 2011年

6
另一种方法可能更现代: "[{0}]".format(", ".join(str(i) for i in mylist))
Jack O'Connor 2013年

2
当是预定义的可调用对象时,我倾向于map(f, xs)(或imap在python2.x中)喜欢。倾向于执行较少的字节码,并且通常更紧凑。当然,不要这就是远逊于(f(x) for x in xs)f map(lambda x:..., xs)(... for x in xs)
SingleNegationElimination

1
@ user1767754:真的吗?链接?
SingleNegationElimination

18

这是简单的代码,因此,如果您是新手,则应该足够容易地理解它。

    mylist = ["x", 3, "b"]
    for items in mylist:
        print(items)

如您所愿,它会全部打印不带引号的内容。


15

仅使用打印:

>>> l = ['x', 3, 'b']
>>> print(*l, sep='\n')
x
3
b
>>> print(*l, sep=', ')
x, 3, b


9

map建议不要使用join可以接受迭代器的生成器表达式:

def get_nice_string(list_or_iterator):
    return "[" + ", ".join( str(x) for x in list_or_iterator) + "]"

这里join是字符串类的成员函数str。它使用一个参数:一个字符串列表(或迭代器),然后返回一个新字符串,其中所有元素都由串联,


2
对Python 2的一个很好的优化,因为map在2.x中返回一个列表。它在3.x中返回一个生成器,因此在此没有太大帮助。
Tom

7
我会回来的", ".join( str(x) for x in list_or_iterator).join('[]')
eyquem 2011年

@eyquem:聪明,我以前从未见过join这样的用法。不过,对于初学者而言,这还是不透明的(因为您使用的属性是字符串是一个单字符字符串的可迭代容器)。
塞斯·约翰逊

6

您可以使用它的字符串中删除所有不想要的字符translate()的方法Nonetable参数,随后包含字符(S)你想为它取出一个字符串deletechars参数。

lst = ['x', 3, 'b']

print str(lst).translate(None, "'")

# [x, 3, b]

如果您使用的是2.6之前的Python版本,则需要使用string模块的translate()功能,因为直到2.6才添加了None作为table参数传递的功能。使用它看起来像这样:

import string

print string.translate(str(lst), None, "'")

使用此string.translate()功能在2.6+中也可以使用,因此使用它可能是更可取的。


2
lst = ["it isn't", 3, 'b']["it isnt", 3, b]lst = ['it isn\'t', 3, 'b']
las

1
@eyquem:是的,如果可能的话,避免删除实际上属于数据的字符(而不是严格地用于分隔字符)自然会要求稍微复杂/不同的逻辑。
martineau 2011年

3

这是一个交互式会话,显示了@TokenMacGuy的一线代码中的一些步骤。首先,他使用该map函数将列表中的每个项目转换为字符串(实际上,他正在创建一个新列表,而不是在旧列表中进行转换)。然后,他使用string方法join将这些字符串结合', '在一起。其余的只是字符串格式,这非常简单。(编辑:此实例非常简单;字符串格式通常会有些复杂。)

请注意,使用join是从几个子字符串构建字符串的一种简单而有效的方法,比通过向字符串中连续添加字符串(这样做涉及在幕后进行大量复制)来实现效率要高得多。

>>> mylist = ['x', 3, 'b']
>>> m = map(str, mylist)
>>> m
['x', '3', 'b']
>>> j = ', '.join(m)
>>> j
'x, 3, b'

2

使用.format字符串格式化,

mylist = ['x', 3, 'b']
print("[{0}]".format(', '.join(map(str, mylist))))

输出:

[x, 3, b]

说明:

  1. map用于将列表的每个元素映射到string类型。
  2. 这些元素通过,分隔符连接在一起成为一个字符串。
  3. 我们在打印语句中使用[]来显示列表大括号。

参考: .format有关字符串格式PEP-3101


大!我发现使用.format最pythonic的方式。但是,我当然接受分歧。;)
love.by.Jesus

0

@AniMenon启发我编写了一个pythonic更通用的解决方案。

mylist = ['x', 3, 'b']
print('[{}]'.format(', '.join(map('{}'.format, mylist))))

它仅使用该format方法。没有任何痕迹str,并且允许对元素格式进行微调。例如,如果将浮点数作为列表的元素,则在这种情况下,可以通过添加转化说明符来调整其格式:.2f

mylist = [1.8493849, -6.329323, 4000.21222111]
print("[{}]".format(', '.join(map('{:.2f}'.format, mylist))))

输出是相当不错的:

[1.85, -6.33, 4000.21]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.