【问题标题】:Trying to make function that simplifies a list of integers by grouping repeats试图通过对重复进行分组来简化整数列表的函数
【发布时间】:2019-11-07 09:01:55
【问题描述】:

我想在 python 中创建一个函数,该函数将一个具有超过 1 个按数字排序的整数元素的列表作为输入,并返回一个相同整数的列表作为输出,但任何重复都组合在一个自己的列表中,此列表是函数返回的列表中的一个元素。例如:

[3,3,4,4,4,5,6,6] 将返回为[[3,3],[4,4,4],5,[6,6]]

我尝试为每个条件嵌入多个 if 语句,但这变得太混乱、太快了。

def simplify(mylist):
    if len(mylist) > 1:
        newlist = []
        for i in range(0, len(mylist) - 1):
            if (mylist[i] == mylist[i + 1]):
                count = 2
                group = [mylist[i], mylist[i]]
                while (i + count) <= (len(mylist) - 1):
                    if mylist[i] == mylist[i + count]:
                        group.append(mylist[i])
                        count += 1
                    else:
                        newlist.append(group)
                        break
            else:
                newlist.append(mylist[i])
        print(newlist)
        return (newlist)

所以我希望它执行我描述的函数应该执行的操作,但随后它生成了一个列表,其中重复的元素在列表中重复减少一个元素,直到它完成迭代并且没有附加最后一个值。示例:

输入[3,4,4,4,4,5]

返回[3,[4,4,4,4],[4,4,4],[4,4],4]

【问题讨论】:

  • 是否需要不使用python内置方法编写函数?你可以用 counter 轻松做到这一点
  • 如果您想将[[3, 3], [4, 4, 4], 5, [6, 6]] 作为输出,请查看我的答案。
  • 如果输入是[3, 3, 4, 3, 3]会发生什么

标签: python python-3.x list sorting


【解决方案1】:

鉴于 inpt 已经排序,您应该只使用 itertools.groupby

from itertools import groupby

def simplify(mylist):
     return [list(group) for key, group in groupby(mylist)]

它会给你:

In [14]: simplify([3, 3, 4, 4, 4, 5, 6, 6])
Out[14]: [[3, 3], [4, 4, 4], [5], [6, 6]]

【讨论】:

  • 如何将[5] 更改为5
  • @MadPhysicist 我不会改变它,当你有包含列表而不是包含列表或整数的列表时,它会更好一些。无论出于何种原因,您都需要它,它只会使代码复杂化。这个函数只做一件事并且做得很好。对数字进行分组,应该由不同的代码来解包
  • 我碰巧完全同意你的看法。出于某种原因,OP 想要以另一种方式。
【解决方案2】:

使用计数器

from collections import Counter
mylist = [3,3,4,4,4,5,6,6]
C = Counter(mylist)
output=[ [key,]*val if val >1 else key for key,val in C.items()]

【讨论】:

  • [key] * val if val &gt; 1 else key 会做 OP 想要做的事情
【解决方案3】:

我可以看到,如果 item 只出现一次,您不希望它成为列表,

from collections import Counter
x = [3,3,4,4,4,5,6,6]
output_list = []
for key, value in Counter(x).items():
    if value != 1:
        output_list.append([key]*value)
    else:
        output_list.append(key)

print(output_list)

输出:

[[3, 3], [4, 4, 4], 5, [6, 6]]

【讨论】:

  • 如果输入是[3,3,4,4,4,5,6,6,4]会发生什么?这将分组为[[3, 3], [4, 4, 4, 4], 5, [6, 6]],它不再只是将彼此相邻的重复分组。 OP 需要澄清他是否希望所有分组重复或只是相邻的重复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多