2016-07-22 54 views
2

我有一个简单的解释:打印元件作为连接字符串

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 

回答

4

使用带发生器表达式的join。 请注意,您在使用此方法时明确地转换为str:如果你想使用一个明确的for循环做

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

UPDATE

,您可以创建一个字符串列表,追加并在回路外呼叫join。我用一个列表,因为它是更有效,因为字符串是不可变的:

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

这可以在循环内完成吗? – fugu

+0

@fugu循环处于'join'函数调用 –

+0

@m_callens - 但是如果我想通过'letters'中的'characters'在更大的循环内完成此操作,该怎么办? – fugu

1

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

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


1234 
+0

这正是我所追求的 - 我认为'end ='''虽然是Python 3的一个特性? – fugu

+1

OP使用Python 2.这只有在从'_future_ import print_function'执行时才有效。 – DeepSpace

+0

@DeepSpace ... yea ...忘记添加导入 –

0

为了摆脱由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 
0

Just wante d添加一个使用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 
+0

Python 3用户需要从functools import中添加' reduce' – Tonechas

1

尝试了这一点: -

>>> 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'