【问题标题】:How to create sublists using a sentinel value? [closed]如何使用标记值创建子列表? [关闭]
【发布时间】:2022-01-10 18:36:19
【问题描述】:

我有一个包含至少 990 个元素(压力值、数字)的 python 列表,例如

lst = ['x','y','z','g','h',1600000,'c','y','n','h','j','y', 1600000]

转折点由标记值 1600000 标记,并且可以出现在列表中的任何位置。我正在尝试提出包含 1600000 之间数字的子列表。由于没有固定间隔,因此索引不起作用。

例如,来自lst,我想创建:

[['x','y','z','g','h'],['c','y','n','h','j','y']]

我能得到关于这个的提示吗?

【问题讨论】:

  • 澄清一下,您是否尝试为1600000 之间的值创建类似子列表的变量?例如,使用您提供的列表,[[x,y,z,g,h],[c,y,n,h,j,y]]
  • 是的,确实,我正在尝试提出包含 1600000 之间的所有数字的子列表。
  • first = myList.index(1600000) 找到第一个标记。 second = myList.index(1600000, first+1) 找到第二个。你能用它吗?
  • 感谢您的建议,但效果不佳。它给出的数字不是子列表。
  • "从上面可以看出,1600000是转折点"不清楚,不如说"转折点用sentinel值1600000标记,而可以出现在数据中的任何位置"

标签: python list list-manipulation


【解决方案1】:

创建两个列表并将值附加到一个,一旦出现转折点,将该列表附加到另一个列表:

def split_list_at_n(lst,n):
    temp = []
    output = []
    if lst[-1] != n:
        lst.append(n)
    for x in lst:
        if x==n:
            output.append(temp)
            temp = []
        else:
            temp.append(x)
    return output

split_list_at_n(lst, 1600000)

输出:

[['x', 'y', 'z', 'g', 'h'], ['c', 'y', 'n', 'h', 'j', 'y']]

与首先找到转折点的索引不同,它只遍历列表一次。

【讨论】:

  • 您上面所说的解决方案非常有效(它只是缺少最后一个转折点,因为列表没有以转折点结尾,我确实添加了 lst.append(1600000) 并且现在可以正常工作)非常感谢
  • @Dandikcic 好收获!感谢您指出。并且在循环之前将转折点附加到列表中应该比在循环中添加另一个 elif 更好。我编辑了我的答案以修复错误:-)
【解决方案2】:

所以,我将首先研究如何遍历列表,然后研究如何追加到适当的子列表。

因此,您需要弄清楚如何停止将变量放入每个子列表中,并在达到转折点时移至下一个子列表。

此外,计算出一些 ifelse 来阻止转折点出现在您的数据中(如果这是您想要的)。

最后,只需return 变量,并检查结果是否是您想要的。如果没有再试一次。

为此我想出了一个解决方案:

def split_list(l,n):
  rl=[[]]
  c=0
  for x in l:
    if x!=n:
      rl[c].append(x)
    else:
      rl.append([])
      c+=1
  return(rl)

这将返回每个间隔的所有子列表(空格由1600000 分隔)。 我已经这样做了,以便您可以输入任何实际值,它会根据该值返回子列表。

像这样使用它:

a=split_list(li,1600000)

【讨论】:

  • 我非常感谢您的努力,非常感谢。定义函数的问题是只返回单个子列表而没有转折点。如果我实现额外的子列表,它将完美运行。
【解决方案3】:

看起来您正在尝试提取 160000s 之间的元素。

作为建议,您应该首先count() 160000(或任何您用于转折点的东西)以确保您在给定列表中恰好有两个转折点。否则,您应该在给定列表中使用不同数量的turning points 以不同方式处理这些案例。当你正好有两个160000 时,使用find() 找出这两个点的索引。最终,您可以在 [ firstTurningPointIndex, secondTurningPointIndex ] 范围内获取给定列表的子列表

【讨论】:

  • 谢谢你的建议,我有8个转折点,一些转折点之间的间隔是200,而有些是变化的,例如84, 96. 因此,如果我有 100 个转折点,索引将不方便。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 2020-01-30
  • 2016-07-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
相关资源
最近更新 更多