【问题标题】:print elements in list as concatenated string将列表中的元素打印为连接字符串
【发布时间】:2016-07-22 14:03:58
【问题描述】:

我有一本简单的字典:

convert = {'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4}

并列出

letters = ('a', 'b', 'c', 'd')

我想遍历列表中的每个元素,并将其用作我的字典中的查找,并将值打印为串联字符串。我正在使用:

for c in letters:
    print convert[c],

哪个输出:

1 2 3 4

如何删除打印语句中的空格(在 v.2.7.10 中)以获得:

1234

【问题讨论】:

    标签: python python-2.7 printing


    【解决方案1】:

    join 与生成器表达式一起使用。 请注意,使用此方法时必须显式转换为str

    convert = {'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4}
    letters = ('a', 'b', 'c', 'd')
    print ''.join(str(convert[c]) for c in letters)
    >> 1234 
    

    更新

    如果您想使用显式的for 循环来执行此操作,您可以创建一个字符串列表,附加到该列表并在循环外调用join。我使用列表是因为它更有效,因为字符串是不可变的:

    output_list = []
    for c in letters:
        # do other stuff
        output_list.append(str(convert[c]))
    print ''.join(output_list)
    

    【讨论】:

    • @fugu 循环在join 函数调用中
    • @m_callens - 但是如果我想通过characters in letters 在更大的循环中执行此操作呢?
    • 我很惊讶你不能在迭代字符串时一次只打印一个字符!
    【解决方案2】:

    如果你想要的只是print 而你不需要最终结果,那么你可以使用printarg 方法:

    >>> from __future__ import print_function
    >>> for c in letters:
            print(convert[c], sep='', end='')
    
    
    1234
    

    【讨论】:

    • 这正是我所追求的——我认为end='' 是 Python 3 的一个特性?
    • OP 正在使用 Python 2。这只有在执行 from _future_ import print_function 时才有效。
    • @DeepSpace...是的...忘记添加导入
    • @fugu...这是 Python3 的一个特性,这就是为什么你需要 import 表达式
    【解决方案3】:

    试试这个:-

    >>> convert = {'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4}
    >>> letters = ('a', 'b', 'c', 'd')
    >>> result = ''
    >>> for i in letters:
            result += str(convert[i])  # Since you want concatenated string
    >>> print result
    '1234'
    

    或者使用列表理解:-

    >>> convert = {'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4}
    >>> letters = ('a', 'b', 'c', 'd')
    >>> ''.join([str(convert[i]) for i in letters])
    '1234'
    

    【讨论】:

      【解决方案4】:

      只是想添加一个使用reduce 的替代方案,虽然它不一定更具可读性,但以后可能会更灵活。如果需要修改代码做其他事情,可以直接调整lambda函数:

      >>> print reduce(lambda x,y: str(x)+str(y),[convert[z] for z in letters])
      1234
      

      或者为了更易读:

      >>> def concat_letters(x,y):
          return str(x)+str(y)
      
      >>> print reduce(concat_letters,[convert[z] for z in letters])
      1234
      

      【讨论】:

      • Python 3 用户需要添加from functools import reduce
      【解决方案5】:

      要摆脱print 引入的额外空格,您可以使用sys.stdout.write() 将数据写入标准输出:

      In [55]: letters = ('a', 'b', 'c', 'd')
      
      In [56]: convert = {'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4}
      
      In [57]: import sys
      
      In [58]: for letter in letters: sys.stdout.write(convert[letter])
      1234
      

      附带说明一下,这里提出的大多数解决方案(包括我的)都会为您提供的输入数据产生预期的输出,但是看看如果letters 包含一个不是的字母(例如'e')会发生什么情况convert 中的一个键:

      In [59]: letters = ('a', 'b', 'c', 'd', 'e')
      
      In [60]: print ''.join(str(convert[letter]) for letter in letters)
      Traceback (most recent call last):
      
        File "<ipython-input-60-da3963dcc14b>", line 1, in <module>
          print ''.join(str(convert[letter]) for letter in letters)
      
        File "<ipython-input-60-da3963dcc14b>", line 1, in <genexpr>
          print ''.join(str(convert[letter]) for letter in letters)
      
      KeyError: 'e'
      

      为避免这种情况,我建议您使用dict.get(),因为此方法返回默认值(在下面的示例中为''),而不是在键不在字典中时引发错误:

      In [61]: print ''.join(str(convert.get(letter, '')) for letter in letters)
      1234
      

      【讨论】:

        猜你喜欢
        • 2020-03-29
        • 2017-07-24
        • 2016-02-20
        • 2020-07-01
        • 2014-11-30
        • 1970-01-01
        • 1970-01-01
        • 2017-10-26
        • 1970-01-01
        相关资源
        最近更新 更多