R函数rep()复制向量的每个元素:
> rep(c("A","B"), times=2)
[1] "A" "B" "A" "B"
Run Code Online (Sandbox Code Playgroud)
这就像Python中的列表乘法:
>>> ["A","B"]*2
['A', 'B', 'A', 'B']
Run Code Online (Sandbox Code Playgroud)
但是使用rep()R函数,还可以指定向量的每个元素的重复次数:
> rep(c("A","B"), times=c(2,3))
[1] "A" "A" "B" "B" "B"
Run Code Online (Sandbox Code Playgroud)
Python中有这样的函数availbale吗?否则怎么定义呢?顺便说一下,我也对复制数组行的这种函数感兴趣.
Luk*_*raf 47
使用numpy数组和numpy.repeat函数:
import numpy as np
x = np.array(["A", "B"])
print np.repeat(x, [2, 3], axis=0)
['A' 'A' 'B' 'B' 'B']
Run Code Online (Sandbox Code Playgroud)
不确定是否有可用的内置,但您可以尝试这样的事情:
>>> lis = ["A", "B"]
>>> times = (2, 3)
>>> sum(([x]*y for x,y in zip(lis, times)),[])
['A', 'A', 'B', 'B', 'B']
Run Code Online (Sandbox Code Playgroud)
请注意,sum()以二次方运行.所以,这不是推荐的方式.
>>> from itertools import chain, izip, starmap
>>> from operator import mul
>>> list(chain.from_iterable(starmap(mul, izip(lis, times))))
['A', 'A', 'B', 'B', 'B']
Run Code Online (Sandbox Code Playgroud)
时间比较:
>>> lis = ["A", "B"] * 1000
>>> times = (2, 3) * 1000
>>> %timeit list(chain.from_iterable(starmap(mul, izip(lis, times))))
1000 loops, best of 3: 713 µs per loop
>>> %timeit sum(([x]*y for x,y in zip(lis, times)),[])
100 loops, best of 3: 15.4 ms per loop
Run Code Online (Sandbox Code Playgroud)
既然你说"数组"并提到R.你可能想要使用numpy数组,然后使用:
import numpy as np
np.repeat(np.array([1,2]), [2,3])
Run Code Online (Sandbox Code Playgroud)
编辑:既然你提到你想重复行,我认为你应该使用numpy.np.repeat有一个轴参数来做到这一点.
除此之外,也许:
from itertools import izip, chain, repeat
list(chain(*(repeat(a,b) for a, b in izip([1,2], [2,3]))))
Run Code Online (Sandbox Code Playgroud)
因为它没有假设您有一个列表或字符串可以相乘.虽然我承认,将所有内容作为参数传递到链中可能并不完美,因此编写自己的迭代器可能会更好.