举个例子:我有一个列表[1,2,3,4,5,6,7,8],我需要把它“拉长”到20,让现有的值尽可能均匀地分布,用None替换“缺失”的值,结果列表必须从1开始,以8结束。
在原始列表中的值之间有8-1个空格和20-8个无要分配的值,所以我们可以为每个“空格”设置一个“无”。
[1, None, 2, None, 3, None, 4, None, 5, None, 6, None, 7, None, 8]现在我们仍然有12-7个None值要分发,我们可以在每隔一个空间分发其中的4个:
[1, None, None, 2, None, 3, None, None, 4, None, 5, None,None 6, None, 7, None,
None, 8]现在我们还剩下一个可以随机分配的:
[1, None, None, 2, None, 3, None, None, 4, None, 5, None, None, 6, None, None 7,
None, None, 8]有没有一种算法可以让你完成这样的任务?也许是一个实现?
发布于 2012-10-21 03:44:14
基本思想:只需从旧位置线性插值新位置。为了简单起见,我们使用地板除法,但您可以更聪明地使用四舍五入除法,以获得稍微均匀的分布。
def stretch_to(l, n):
out = [None] * n
m = len(l)
for i, x in enumerate(l):
out[i*(n-1)//(m-1)] = x
return out示例:
>>> stretch_to(range(8), 20)
[0, None, 1, None, None, 2, None, None, 3, None, 4, None, None, 5, None, None, 6, None, None, 7]发布于 2012-10-21 03:42:54
如果你的第一个列表中有n次,第二个列表中有m个项目。像这样的东西会起作用的。
l2 = [None for I in range(m)]
for i, x in emumerate(l1):
index = i * m / n
l2[index] = l1[i]你需要决定边缘情况的行为,如果m<n的话该怎么做,等等。
发布于 2012-10-21 08:07:09
这里有一个我认为很有趣的简洁的替代方案:
def stretch(seq, n):
seq = [seq[i * (len(seq) - 1) // (n - 1)] for i in range(n)]
return [seq[0]] + [x if x != y else None for x, y in zip(seq[1:], seq)]基于此,基于itertools的版本不对列表进行任何复制,返回一个迭代器,您可以选择将该迭代器转换为列表:
from itertools import tee, chain, izip
def stretch(seq, n):
s1, s2 = tee(seq[i * (len(seq) - 1) // (n - 1)] for i in range(n))
return chain((next(s1),), (x if x != y else None for x, y in izip(s1, s2)))https://stackoverflow.com/questions/12991962
复制相似问题