gpt4 book ai didi

python - 在按长度排序的列表中查找相同值的子序列的索引

转载 作者:太空宇宙 更新时间:2023-11-03 15:28:32 25 4
gpt4 key购买 nike

还有这个类似的question ,但不完全是我要问的。

假设我有一个 1 和 0 的列表:

# i.e. [1, 0, 0, 0, 1, 1, 1, 1, 0, 1]
sample = np.random.randint(0, 2, (10,)).tolist()

我正在尝试查找具有相同值的子序列的索引,并按其长度排序。所以在这里,我们将有以下子列表:

[1, 1, 1, 1]
[0, 0, 0]
[1]
[0]
[1]

所以他们的索引将是 [4, 1, 0, 8, 9] .

我可以这样做得到排序的子序列:

sorted([list(l) for n, l in itertools.groupby(sample)], key=lambda l: -len(l))

但是,如果我得到重复的子序列,我将无法立即找到索引(我将不得不使用另一个循环)。

我觉得有一种更直接、更 Python 的方式来做我想做的事情,就像前面问题的答案所暗示的那样。这就是我正在寻找的。

最佳答案

您可以首先使用 enumerate(..) 创建索引和值的元组。接下来,您将groupby放在元组的第二个元素上,最后将它们映射回第二个索引。喜欢:

<b>map(lambda x:x[0][0],</b> # obtain the index of the first element
sorted([list(l) for _,l in itertools.groupby(<b>enumerate(</b>sample<b>)</b>, # create tuples with their indices
<b>key=lambda x:x[1]</b>)], # group in value, not on index
key=lambda l: -len(l)))

在控制台中运行(压缩命令)时,它会生成:

>>> map(lambda x:x[0][0],sorted([list(l) for _,l in itertools.groupby(enumerate(sample),key=lambda x:x[1])],key=lambda l: -len(l)))
[4, 1, 0, 8, 9]

N.B. 1: instead of using lambda l: -len(l) as key when you sort, you can use reverse=True (and key = len), which is more declarative, like:

map(lambda x:x[0][0],
sorted([list(l) for _,l in itertools.groupby(enumerate(sample),
key=lambda x:x[1])],
<b>key=len, reverse=True</b>))

N.B. 2: In map will produce an iterator and not a list. You can materialize the result by calling list(..) on the result.

关于python - 在按长度排序的列表中查找相同值的子序列的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43044060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com