【问题标题】:insert None based on indexes根据索引插入无
【发布时间】:2020-07-04 10:09:19
【问题描述】:

如果列表中缺少任何索引,我正在尝试适应 None。

mylist = [1,2,3,4,5,8,9]

在上面的列表中,我想在 6,7 和 10 时都适合

end result = [1,2,3,4,5,None,None,8,9,None]

在元素 5 之前我不会有任何缺失值。但在那之后,我可能会错过所有元素或少数元素。 我试图通过在丢失的元素中插入 None 来使我的列表长度为 10。 几个样本缺失元素:

1 - [1,2,3,4,5,6] , expected result - [1,2,3,4,5,6, None, None, None, None] 
2 - [a,b,c,d,e,h,i ], expected result - [a,b,c,d,e,None,None,h,i]

注意:任何索引之间的差异都是 1。直到索引 5(e) 将获取所有值,所以我使用以下逻辑

逻辑——我用过距离——

    distance = (-1 * (mylist[3]-mylist[4]))
    distance = 1
    index_missing_distance = (-1*(mylist[3] -mylist[5])) which is equal to 2 (i.e for the above sample 1 ) 
distance between mylist[3] - mylist[6] will be 3... so based on the index_missing_distance ill fill my None values in that index.

代码:

if len(mylist) < 7:
     if index_missing_distance == 2:
          mylist[7:1] = [None,None, None, None]
elif len(mylist) < 8:
     do something
elif len(mylist) < 9:
.....

假设如果它是 3 则做另一个 if else。像这样,我将不得不根据缺少的值来拟合 None。我不得不写这么多 if 案例,这让我的代码变得复杂。在这方面需要一些帮助。我们可以使用类似while循环的东西吗?

提前致谢。

【问题讨论】:

  • 为你添加了新的例子,请测试一下。

标签: python-3.x loops dataframe if-statement while-loop


【解决方案1】:

数字:

mylist = [1,2,3,4,5,8,9]

print([i if i in mylist else None for i in range(min(mylist), 11])

按字母顺序:

import string

mylist = ['a', 'b', 'c', 'g']
index_start = string.ascii_lowercase.index('a')
index_end = string.ascii_lowercase.index('g')

print([i if i in mylist else None for i in string.ascii_lowercase[index_start:index_end + 1]])

【讨论】:

  • 你能检查我的样品 - 2 吗?我正在使用距离方法来计算,但我的列表元素也可能是字母。
  • distance = (-1 * (mylist[3]-mylist[4])) index_missing = (-1*(mylist[3] -mylist[5])) which is equal to 2 (i.e for the above sample 1 ) 这是公式,也用于字符(边界框值)这意味着我的文本是列表形式。
  • 我为你添加了新示例
【解决方案2】:

可以通过搜索得到索引,然后在数组中插入None。

import numpy as np
mylist = [1,2,3,4,5,8,9]

for i in range(6,11):
    if not i in mylist:
        index = np.searchsorted(mylist, i)
        mylist = mylist[0:index] + [None] + mylist[index:]

【讨论】:

    【解决方案3】:

    这是一个函数,它返回前五个列表项不变,并将接下来的五个项放在n5 参数给定的位置,同时用None 替换缺失的项。

    基本上,n5 参数是完整序列的最后 5 项的外观。

    def none10(lst, n5):
        s5 = set(lst[5:])
        return lst[0:5] + [x if x in s5 else None for x in n5]
    
    print(none10([11,13,12,4,5,  7,9], [6,7,8,9,10]))
    print(none10(['a','b','c','d','e',  'h','i'], ['f','g','h','i','j']))
    

    输出是(编辑以显示 5+5 拆分):

    [11,13,12,4,5,   None,7,None,9,None]
    ['a','b','c','d','e',   None,None,'h','i',None]
    

    【讨论】:

    • 我肯定要用逻辑,你能用while循环替换我的if else吗?
    • 我不明白你的回答“我不知道n5”
    • 我在 1000 个样本上运行这个,所以我无法识别你已经声明的 n5。这就是我使用距离作为度量来了解索引的原因。而且我的 len (list) 并不总是 10,但它大于 5。
    • 对不起,我可能不完全理解你的问题。您能否添加更多输入 -> 输出示例?
    猜你喜欢
    • 2018-11-04
    • 2021-08-08
    • 2019-05-19
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 2021-06-10
    • 2022-11-11
    • 2022-01-05
    相关资源
    最近更新 更多