【问题标题】:How can I implement a function that reduces a list to the minimum set of elements that are repeated in the list? [closed]如何实现一个函数,将列表减少到列表中重复的最小元素集? [关闭]
【发布时间】:2014-11-26 20:08:08
【问题描述】:

如何实现一个应用于该列表的函数给我最小的元素组,如果重复 n 次会生成该列表?

例如

a = [1,2,3,4,1,2,3,4,1,2,3,4]
foo(a)  

返回 [1,2,3,4]

a = [1,1,1,1]
foo(a) 

返回 [1]

a = [1,2,3,4,5,6]
foo(a)  

返回 [1,2,3,4,5,6]

编辑

换句话说,这个函数需要找到细菌(参见下面的解决方案),一组元素,它们的重复会完全按原样生成列表。

重复减少函数是不够的,因为例如,[1,2,1,1] 会变成 [1,2]。

【问题讨论】:

  • foo([1,2,1]) 这样的东西应该返回什么?
  • @Beginner:按照我的阅读方式,这不仅仅是元素的集合;例如,我相信[1, 1, 2, 1, 1, 2] 会变成[1, 1, 2],而不是[1, 2]。但是,最好让 OP 澄清一下。
  • 是的,目前还不清楚。但是如果[1,2,1]需要转换成[1,1,2],那不就是排序吗?
  • @Beginner 不,这不是a duplicate

标签: python list function set reduce


【解决方案1】:

这是一个简单的方法:

def findGerm(x):
    for ix in xrange(1, len(x)+1):
        if x == x[:ix]*(len(x)//ix):
            return x[:ix]

然后:

>>> findGerm([1, 2, 3, 1, 2, 3])
[1, 2, 3]
>>> findGerm([1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3])
[1, 1, 2, 3]
>>> findGerm([3, 2, 1, 3, 2, 1])
[3, 2, 1]
>>> findGerm([1, 2, 1])
[1, 2, 1]

基本上,它采用列表的开始块并尝试将它们相乘以等于原始列表的长度。如果结果等于原始列表,那么您已经找到了“细菌”。在最坏的情况下,它会一直走到列表的末尾,在这一点上,它相当于自己重复一次。

【讨论】:

  • +1 有点低效,尤其是很长的x,但很干净。
【解决方案2】:

可能是这样的:

def foo(subject):
    def test_seq(pattern):
        if len(subject) % len(pattern) != 0: return False   # Quick length check

        for i in range(len(subject) / len(pattern)):
            offset = i * len(pattern)
            sublist = subject[offset:offset+len(pattern)]   # Extract sublist
            if sublist != pattern: return False

        return True                                         # All sublists == pattern

    for i in range(len(subject)):
        pattern = subject[0:(i+1)]
        if test_seq(pattern):
            return pattern

print foo([1,2,3,4,1,2,3,4,1,2,3,4])
print foo([1,1,1,1])
print foo([1,2,3,4,5,6])

foo(subject) 根据subject 中的前 n 个元素生成候选序列,其中 n = 1,2,3,...,len(subject)

然后将这些候选序列 (pattern) 针对对象进行多次测试,以适应 test_seq()

【讨论】:

    【解决方案3】:
    from collections import OrderedDict
    
    def foo(example_list):
        a = OrderedDict()
        for i in example_list:
            a[i] = i
        return [key for key in a.iterkeys()]
    

    如果将[1,2,3,4,1,2,3,4] 作为参数传递,则返回[1,2,3,4]

    【讨论】:

    • 这通常不起作用(尝试list(set([3, 2, 1, 3, 2, 1])))。
    • 我编辑了,也许这个可行。
    • 使用dict 非常难懂...而且它基本上和set 做同样的事情。
    • 这确实有效!我不知道那些同时拒绝问答的人有什么问题。可能根本没有得到问题。
    • 它不起作用。 foo([1, 2, 1]) 返回[1, 2]
    猜你喜欢
    • 2016-04-02
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2014-08-01
    • 2017-02-13
    • 2020-05-06
    • 2015-08-08
    • 1970-01-01
    相关资源
    最近更新 更多