Python中数字向量的R's paste命令的等价物

时间:2015-01-20 13:21:15

标签: python r string

以前一定要问过,但我恐怕找不到答案了。

在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))]

5 个答案:

答案 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 !']