Python:Join,Strings,Iterables和DWIM

时间:2018-02-14 17:07:05

标签: python list dictionary join iterable

应该{​​{1}} DWIM(做我的意思),还是有太多可能性,我应该继续进行所有检查?

我有一个结果,可以是单个int,一个int列表,一个字符串或一个字符串列表。似乎我必须将结果编组到一个字符串化元素列表中,只是为了将一个iterable传递给join。出于显而易见的原因,我也不希望将单个字符串拆分为字符。

以下是口译员的一些尝试:

join

所以看起来最好的事情就是最后一点,即:

%> python
Python 3.6.0 (default, Dec 11 2017, 16:14:47) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> x = 0
>>> ','.join(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only join an iterable
>>> x = [0, 1]
>>> ','.join(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected str instance, int found
>>> ','.join(map(str,x))
'0,1'
>>> x = 0
>>> ','.join(map(str,x))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>>> if not isinstance(x, (list, tuple)):
...     x = [x]
... 
>>> ','.join(map(str, x))
'0'
>>> x = [0, 1]
>>> ','.join(map(str, x))
'0,1'

我正在寻找一种更好的方法来做到这一点,或者如果这是最好的方法,我会对此进行改进。

[徘徊于关于Perl的嘀咕......]

1 个答案:

答案 0 :(得分:2)

你所拥有的并不是坏事。我能想到的只是显式检查可迭代并使用三元语句。换句话说,只有在有可迭代时才使用join

from collections import Iterable

joined = str(x) if not isinstance(x, Iterable) else ','.join(map(str, x))