以前一定要问过,但我恐怕找不到答案了。
在R中,我可以写
paste0('s', 1:10)
返回10个字符(字符串)变量的列表:
[1] "s1" "s2" "s3" "s4" "s5" "s6" "s7" "s8" "s9" "s10"
如何在Python中完成此操作?我能想到的唯一方法是使用for循环,但必须有一个简单的单行。
我尝试过像
这样的事情's' + str(np.arange(10))
['s', str(np.arange(10))]
答案 0 :(得分:17)
>>> ["s" + str(i) for i in xrange(1,11)]
['s1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's10']
编辑:range
适用于Python 2和Python 3,但在Python 2中xrange
可能更有效(它是一个生成器而非列表)。 Thansk @ytu
答案 1 :(得分:7)
>>> list(map('s{}'.format, range(1, 11)))
['s1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's10']
答案 2 :(得分:6)
cdyson37的答案是最蟒蛇的;当然,在您的情况下,您仍然可以使用range
而不是xrange
。
在Python2中,您还可以通过以下方式更加强调功能样式:
map(lambda x: "s"+str(x), range(1,11))
答案 3 :(得分:0)
这些答案中没有一个可以推广到任意数量的参数,例如R中的paste
。这是原始R函数的一个非常忠实的端口。唯一要记住的是,每个元素都必须以列表形式显示,因为R中的字符串实际上只是引擎盖下的字符向量:
import itertools
def paste(*args, sep = ' ', collapse = None):
"""
Port of paste from R
Args:
*args: lists to be combined
sep: a string to separate the terms
collapse: an optional string to separate the results
Returns:
A list of combined results or a string of combined results if collapse is not None
"""
combs = list(itertools.product(*args))
out = [sep.join(str(j) for j in i) for i in combs]
if collapse is not None:
out = collapse.join(out)
return out
用法:
paste (['s'], range(10), sep = '')
Out[62]: ['s0', 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9']
paste (['s'], range(2), ['t'], range(3), sep = '')
Out[63]: ['s0t0', 's0t1', 's0t2', 's1t0', 's1t1', 's1t2']
paste (['s'], range(2), ['t'], range(3), sep = '', collapse = ':')
Out[64]: 's0t0:s0t1:s0t2:s1t0:s1t1:s1t2'
您可以通过使用currying获得paste0
:
from functools import partial
paste0 = partial(paste, sep = '')
答案 4 :(得分:0)
这有点接近R的粘贴(包括重复长度为1以外的参数的怪癖。
def paste(*args, sep = " ", collapse = None):
l = [list(arg) if isinstance(arg, str) else arg if hasattr(arg, '__len__') else list(str(arg)) for arg in args]
l = list(itertools.islice((sep.join(parts) for parts in zip(*(itertools.cycle(map(str, e)) for e in l))), (max((len(x) for x in l)))))
if collapse is not None:
l = collapse.join(l)
return l
paste(["a", "b"], range(2), "!")
# ['a 0 !', 'b 1 !']