我有一个这样的列表清单。
lst=[[0, 0.05],
[1, 0.02],
[3, 0.02],
[5, 0.01]]
我想在列表中添加缺少的列表以获取此信息。
lst=[[0, 0.05],
[1, 0.02],
[2, 0.01],
[3, 0.01],
[4, 0.005],
[5, 0.005]]
在这里,执行在[2,x2]
和[1,x1]
之间以及[3,x3]
和x2=x3/2
之间添加的x3=x2
。对[4, x4]
也是一样。
我已经尝试过了。
for i in range(len(lst)):
if lst[i][0]!=i:
lst1=[]
lst1.append(i)
lst1.append(lst[i+1][1]/2)
lst.append(lst1)
此代码无法跟踪要迭代的元素,并添加重复项和错误值。
答案 0 :(得分:2)
您可以通过列表理解来做到这一点:
r=lst[:1]+[[k+1,v/(j-i)] for (i,_),(j,v) in zip(lst,lst[1:]) for k in range(i,j)]
print(r) # [[0, 0.05], [1, 0.02], [2, 0.01], [3, 0.01], [4, 0.005], [5, 0.005]]
或使用程序代码:
r = lst[:1]
for j,v in lst[1:]:
i = r[-1][0]
for k in range(i,j):
r.append([k+1,v/(j-i)])
答案 1 :(得分:1)
您可以使用numpy数组:
# append the two lists together
append_lst = np.append(np.array(lst), np.array(missing_lst), axis=0)
# sort by first column
append_lst[append_lst[:,0].argsort()]
哪里
lst=[[0, 0.05],
[1, 0.02],
[3, 0.02],
[5, 0.01]]
和
missing_lst=[[2, 0.01],
[4, 0.005]]
输出:
array([[0. , 0.05 ],
[1. , 0.02 ],
[2. , 0.01 ],
[3. , 0.02 ],
[4. , 0.005],
[5. , 0.01 ]])
答案 2 :(得分:1)
由于一次只有一个缺失值,因此应该可以:
lst=[[0, 0.05],
[1, 0.02],
[3, 0.02],
[5, 0.01]]
finlst = [lst[0]]
for ll in lst[1:]:
lind = finlst[-1][0]
if ll[0] - lind == 1:
finlst.append(ll)
else:
finlst.extend([[lind+1, ll[1]/2], [lind+2, ll[1]/2]])
finlst
是:[[0, 0.05], [1, 0.02], [2, 0.01], [3, 0.01], [4, 0.005], [5, 0.005]]
。
由于我们在这里,因此我提出了一种更通用的解决方案,也可以在缺少多个值的情况下工作。
finlst = [lst[0]]
for ll in lst[1:]:
lastind = finlst[-1][0]
toadd = ll[0] - lastind
for i in range(toadd):
finlst.append([lastind+i+1, ll[1]/toadd])
答案 3 :(得分:1)
这可能不是您想要精确实现的方式,但是我将对您的代码提出一些偏差。
那:
mydict = {0: 0.05,
1: 0.02,
3: 0.02,
5: 0.01}
for i in range(max(mydict.keys()) - 1, min(mydict.keys()), -1):
if i not in mydict.keys():
mydict[i] = mydict[i + 1] / 2
mydict[i + 1] = mydict[i + 1] / 2
lst = sorted(map(list, mydict.items()))
答案 4 :(得分:1)
最适合您的问题的是interpolation。
如果您希望进行线性回归(以牺牲准确性为代价),则一段代码可能如下所示:
elementsToAdd = list(set([i for i in range(0, lst[-1][0] + 1]) - set([i[0] for i in lst]))
for e in lst:
if (e[0] - 1) in elementsToAdd:
lst.append([(e[0] - 1), e[1] / 2.0]
lst.sort(key = (lambda x: x[0]))
答案 5 :(得分:1)
只需在迭代过程中构建逻辑即可。我添加了处理大于1的缺口的功能,但是无论如何,代码无论哪种方式都应该可以正常工作。
lst=[[0, 0.05],
[1, 0.02],
[3, 0.02],
[5, 0.01]]
prev_idx, prev_val = lst[0] #keeps track of last idx and value seen
result = [[prev_idx, prev_val]]
for idx, val in lst[1:]:
if (idx - prev_idx) == 1: #no gap, just add values as is
result.append([idx, val])
else:
steps_to_add = idx - prev_idx
gap_to_fill = (val)/steps_to_add
for i in range(prev_idx + 1, idx + 1): #iterate and fill upto current idx
result.append([i, gap_to_fill])
prev_idx, prev_val = idx, val
print(result)
#Output:
[[0, 0.05], [1, 0.02], [2, 0.01], [3, 0.01], [4, 0.005], [5, 0.005]]
答案 6 :(得分:1)
您可以这样做:
for i in range(len(lst)):
if lst[i][0] != i:
lst[i][1] = lst[i][1] / 2
lst1 = [lst[i][0] - 1, lst[i][1]]
lst.append(lst1)
lst.sort()
print(lst)
输出为:
[[0, 0.05],
[1, 0.02],
[2, 0.01],
[3, 0.01],
[4, 0.005],
[5, 0.005]]