【问题标题】:how to count the longest sequence of the same value in a list of lists, and then output the largest sequence in a tuple如何计算列表列表中相同值的最长序列,然后输出元组中的最大序列
【发布时间】:2018-08-16 03:11:01
【问题描述】:

我有一个文本文件中的列表列表 9),其值类似于以下内容:

L = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

这是我正在使用的功能:

def longest_sequence(l):
        counter = 0
        sl = []
        sublists = []
        for i in l:
            if (l[counter+1]==l[counter]):
                sl.append(l[counter])
                counter = counter + 1
            else:
                counter = 0
                sublists.append([sl[i], len(sl)])
        return sublists

在这种情况下,现在只计算一个值,首先出现的那个 (1) 然后它转到类似于序列的下一行,我得到的输出是这个:

returns the sub lists [[1, 111], [1, 222], [1, 333], [1, 444], [1, 555], [1, 666], [1, 777], [1, 888]] 

基本上我要做的是检查列表并从该列表中验证哪个子列表的长度最长,所以我应该得到这样的东西:

sl = [(1, 111), (0, 395), (1, 65), (2, 358), (1, 71)]

作为第二个元组,返回为 ti 的元组包含在所有子列表中连续重复 395 次(最长长度)的值。

【问题讨论】:

  • 所以你想找到与在每个文本文件中找到的列表相比最长的列表?
  • 不,我正在尝试检查上面列表中每个子列表的长度,并返回子列表中重复次数最多的值,所以它应该给我那个长度子列表和该子列表中的值。这些值仅在 0、1 和 2 之间变化。
  • 您发布的示例只是一个没有子列表的列表。

标签: python list


【解决方案1】:

您可以简单地使用itertools.groupby()

In []:
import itertools as it

[(k, sum(1 for _ in g)) for k, g in it.groupby(L)]
# [(k, len(list(g)) for k, g in it.groupby(L)]  # alternative

Out[]:
[(1, 112), (0, 394), (1, 65), (2, 359), (1, 71)]

要获得最大值,您可以使用max()key,例如:

In []:
import operator as op

counts = [(k, sum(1 for _ in g)) for k, g in it.groupby(L)]
max(counts, key=op.itemgetter(1))

Out[]:
(0, 394)

但是,修复您的代码。

  • 您混淆了您的索引 (counter),当您在 else: 块中重置它时,您又从头开始。只需在 for 循环中使用 range(1, len(l)) 作为索引。
  • 您不会在 else: 块中重置 sl(因此它会不断增长 111),但您确实不需要创建 sl 列表,只需计算项目数
  • 你错过了最后一个值的大小写
  • 处理最后一个值需要对逻辑进行一点重新排序

如此固定,它看起来像:

def longest_sequence(l):
    counter = 1
    sublists = []
    for i in range(1, len(l)):
        if l[i] != l[i-1]:
            sublists.append([l[i-1], counter])
            counter = 0
        counter += 1

    if counter > 0:
        sublists.append((l[i], counter))

    return sublists

In []:
longest_sequence(L)

Out[]:
[(1, 112), (0, 394), (1, 65), (2, 359), (1, 71)]

In []:
max(longest_sequence(L), key=op.itemgetter(1))

Out[]:
(0, 394)

【讨论】:

  • 谢谢,这行得通,但是我只缺少一个部分。最后我只需要包含最长序列的元组,在这种情况下它将是 (0, 394) 比较该子列表中每个元组的第二个值是否简单?
  • 我试过这个代码:import operator as op counts = [(k, sum(1 for _ in g)) for k, g in it.groupby(L)] max(counts, key= op.itemgetter(1)) Out[]: (0, 394) 至少在我的情况下我得到的输出是: ([1, 112], 1)...
  • 打印出counts,看看您是否看到了您期望的配对。看起来您已经获得了额外的tuple 价值。上面的代码是你不应该得到的。
  • 我会告诉你:当我打印分配给计数的语句时,这就是我得到的 [([1, 112], 1), ([0, 394], 1), ( [1, 65], 1), ([2, 359], 1), ((1, 71), 1)] 那么如果继续 max 行,我会得到: ([1, 112], 1)
  • 完成了,我做错了,这就是我得到这些值的原因,但现在是你得到的答案:) 谢谢!
【解决方案2】:

您可以使用run length encoding 算法。 more_itertools 库中的示例工具:

代码

import more_itertools as mit    


list(mit.run_length.encode(L))
# [(1, 112), (0, 394), (1, 65), (2, 359), (1, 71)]

详情

.encode 方法返回等效于以下生成器表达式:

((k, ilen(g)) for k, g in groupby(iterable))

您可以选择使用.decode 方法取回原始列表。

通过> pip install more_itertools安装。

【讨论】:

    猜你喜欢
    • 2022-12-04
    • 1970-01-01
    • 2012-11-13
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多