在列表列表中追加列表

时间:2019-05-13 13:55:36

标签: python

我有一个这样的列表清单。

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)

此代码无法跟踪要迭代的元素,并添加重复项和错误值。

7 个答案:

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