【问题标题】:Python, print delimited listPython,打印分隔列表
【发布时间】:2011-01-24 20:11:19
【问题描述】:

考虑使用此 Python 代码打印逗号分隔值列表

for element in list:
    print element + ",",

如果element 是列表中的最后一个元素,那么打印时不出现逗号的首选方法是什么。

a = [1, 2, 3]
for element in a
  print str(element) +",",

output
1,2,3,
desired
1,2,3

【问题讨论】:

标签: python string printing


【解决方案1】:

这就是join 的用途。

','.join([str(elem) for elem in a])

【讨论】:

  • TypeError: sequence item 0: expected string, int found. 对他的样本输入不起作用。
  • 对,对不起。它不会自动将整数转换为字符串。修复了一个漂亮的列表理解。
  • 不要使用列表理解。取出[]s,它会生成一个生成器,它也能正常工作,而不会创建(可能很大)不必要的临时列表。
【解决方案2】:
print ','.join(a)

【讨论】:

  • join 不会自动将整数转换为字符串,所以这不起作用。
  • @musicfreak 你觉得它不会自动 str() 它看起来很傻吗?毕竟,''.join() 是一个 String 方法。我想知道为什么它不免费提供。
  • @orokusaki:这违背了“显式胜于隐式”的理念。
【解决方案3】:
>>> ','.join(map(str,a))
'1,2,3'

【讨论】:

  • 如何将它与对象的字段一起使用?所以我会用“a.name”代替“a”?
  • 稍微解释一下就好了,你的回答纯粹包含代码。
【解决方案4】:

其他答案中建议的','.join 是典型的Python 解决方案;迄今为止我在任何答案中都没有看到的正常方法是

print ','.join(str(x) for x in a)

称为生成器表达式或 genexp。

如果您更喜欢循环(或者需要循环用于其他目的,例如,如果您不仅仅在每个项目上打印),当然也有很好的选择:

for i, x in enumerate(a):
  if i: print ',' + str(x),
  else: print str(x),

这是第一次切换(适用于任何可迭代的 a,无论是列表还是其他),因此它会将逗号 放在每个项目之前,但第一个。最后一次的开关稍微不那么优雅,它仅适用于具有len() 的可迭代对象(不适用于完全通用的):

for i, x in enumerate(a):
  if i == len(a) - 1: print str(x)
  else: print str(x) + ',',

此示例还利用 last-time 开关在打印最后一项时终止该行。

enumerate 内置函数非常有用,值得牢记!

【讨论】:

  • enumerate 很好,但在 OP 的情况下,一个简单的连接就足够了。
  • 当然,这就是我开始的方式(在其他答案有地图、listcomps 或没有转换为字符串的时候给出 genexp)——你 见过这个答案的第一段,也许?-) 第一次和最后一次的开关更加通用,甚至没有其他答案提到它们,所以我当然也选择指出它们(包括它们是最好通过枚举完成)。
  • 看着你的回答,看着ghostdog的回答,我有些疑惑。列表理解是否使用比他的示例中的 map 更多的内存,但 map() 是否比 LH 慢?顺便说一句,我向通过电子邮件向我寻求 Python 帮助的人推荐了你的书 :)
  • @orokusaki,map 和 listcomp 的内存消耗相同(genexp 较低,这是我使用的); genexp 通常稍微慢一些(如果你有大量可用的物理内存,也就是说,否则 listcomp 和 map 的内存消耗会损害它们的性能),并且 map 有时甚至比 listcomp 更快(除非它涉及使用 lambda,这会减慢它的速度)。这些性能问题都不是什么大问题,除非您出于某种原因必须注意您的内存占用,在这种情况下,genexp 在内存中的简约可能是一个大问题;-)。
  • @Ah,我什至没有注意到你离开了括号。我现在明白了。我喜欢使用 genexp 的想法。我宁愿让我的用户等待额外的 0.1 毫秒,也不愿通过占用内存来减少我可以处理的并发请求的数量。更不用说,由于我无法控制可迭代的大小,所以有人真的可以用 listcomp 版本来搞定事情。
【解决方案5】:
>>> a=[1,2,3]
>>> a=[str(i) for i in a ]
>>> s=a[0]
>>> for i in a[1:-1]: s="%s,%s"%(s,i)
...
>>> s=s+","+a[-1]
>>> s
'1,2,3'

【讨论】:

  • 我不得不假设你在开玩笑
【解决方案6】:
 def stringTokenizer(sentense,delimiters):
     list=[]
     word=""
     isInWord=False
     for ch in sentense:
         if ch in delimiters:
             if isInWord: # start ow word
                 print(word)
                 list.append(word)
                 isInWord=False
         else:
             if not isInWord: # end of word
                 word=""
                 isInWord=True
             word=word+ch
     if isInWord: #  end of word at end of sentence
             print(word)
             list.append(word)
             isInWord=False
     return list

print (stringTokenizer(u"привет парни! я вам стихами, может быть, еще отвечу",", !"))

【讨论】:

  • 我已经替换了示例字符串,因为它对俄语来说太冒犯了。
【解决方案7】:

有两种选择,

您可以使用直接打印答案 print(*a, sep=',') 这将使用分隔符作为“,”你会得到答案,

1,2,3

另一个选项是,

print(','.join(str(x) for x in list(a)))

这将迭代列表并打印 (a) 并将输出打印为

1,2,3

【讨论】:

    【解决方案8】:

    很简单:

    print(*a, sep=',')
    

    Print lists in Python (4 Different Ways)

    祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      相关资源
      最近更新 更多