我正在考虑使用增量在列表中获取值。
l = [0,1,2,3,4,5,6,7]
我希望像:
[0,4,6,7]
目前我正在使用l[0::2]
,但我希望在开始时采样稀疏,并在列表末尾增加。
我想要这个的原因是因为列表表示从圆心到圆周上的点的直线上的点。此刻,我沿着线重复每10个点,并在每个点上绘制一个小半径的圆。因此,靠近中心的圆圈往往会重叠,当我接近圆形边缘时,我会有间隙。我希望这提供了一些背景。
谢谢!
答案 0 :(得分:1)
这可能比听起来更复杂......你需要一个从零开始并在列表中的最后一个元素位置结束的索引列表,可能没有重复(即你不想得到它相同点两次)。执行此操作的一般方法是首先定义所需的点数,然后使用生成器(scaled_series
),该生成器根据函数生成所需数量的索引。我们需要第二个生成器(unique_ints
)来确保我们得到整数索引而没有重复。
def scaled_series(length, end, func):
""" Generate a scaled series based on y = func(i), for an increasing
function func, starting at 0, of the specified length, and ending at end
"""
scale = float(end) / (func(float(length)) - func(1.0))
intercept = -scale * func(1.0)
print 'scale', scale, 'intercept', intercept
for i in range(1, length + 1):
yield scale * func(float(i)) + intercept
def unique_ints(iter):
last_n = None
for n in iter:
if last_n is None or round(n) != round(last_n):
yield int(round(n))
last_n = n
L = [0, 1, 2, 3, 4, 5, 6, 7]
print [L[i] for i in unique_ints(scaled_series(4, 7, lambda x: 1 - 1 / (2 * x)))]
在这种情况下,函数是1 - 1 / 2x,它给出了你想要的系列[0,4,6,7]。你可以使用长度(4)和函数来获得你想要的圆之间的间距。
答案 1 :(得分:0)
我不确定你想要使用什么样的算法,但是如果它是非常量的,就像你的例子那样,那么你应该考虑创建一个生成函数来产生值: https://wiki.python.org/moin/Generators
根据您的需求,您可能需要考虑像scipy这样的内置插补器:https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp1d.html#scipy.interpolate.interp1d
基本上,根据您的问题,您无法使用基本切片运算符。没有更多信息,这是我能给你的最佳答案:-)
答案 2 :(得分:0)
使用slice
功能创建一系列索引。然后,您可以使用其他切片扩展切片列表。
k = [0,1,2,3,4,5,6,7]
r = slice(0,len(k)//2,4)
t = slice(r.stop,None,1)
j = k[r]
j.extend(k[t])
print(j) #outputs: [0,4,5,6,7]
答案 3 :(得分:0)
我要做的只是使用list comprehension来检索值。仅通过索引不可能做到这一点。这就是我想出的:
l = [0, 1, 2, 3, 4, 5, 6, 7]
m = [l[0]] + [l[1+sum(range(3, s-1, -1))] for s in [x for x in range(3, 0, -1)]]
以下是将代码细分为循环:
# Start the list with the first value of l (the loop does not include it)
m = [l[0]]
# Descend from 3 to 1 ([3, 2, 1])
for s in range(3, 0, -1):
# append 1 + sum of [3], [3, 2] and [3, 2, 1]
m.append(l[ 1 + sum(range(3, s-1, -1)) ])
两者都会给你相同的答案:
>>> m
[0, 4, 6, 7]