组重复列表的元素

时间:2017-11-15 19:09:54

标签: python python-3.x list

我正在尝试创建一个接收列表的函数,并返回带有重复元素的另一个列表。

例如输入A = [2,2,1,1,3,2](列表未排序),函数将返回result = [[1,1], [2,2,2]]。结果不需要排序。

我已经在Wolfram Mathematica中完成了它,但现在我必须将它翻译成python3,Mathematica有一些功能,如Select,Map和Split,这使得它非常简单,不需要使用带有大量指令的长循环。

4 个答案:

答案 0 :(得分:3)

get("/dashboard", "dashboard#index", "dashboard")

答案 1 :(得分:2)

简单方法:

def grpBySameConsecutiveItem(l):
    rv= []
    last = None
    for elem in l:
        if last == None:
            last = [elem]
            continue
        if elem == last[0]:
            last.append(elem)
            continue
        if len(last) > 1:
            rv.append(last)
        last = [elem]
    return rv


print grpBySameConsecutiveItem([1,2,1,1,1,2,2,3,4,4,4,4,5,4])

输出:

[[1, 1, 1], [2, 2], [4, 4, 4, 4]]

如果您希望对输入列表进行排序或排序,则可以对输出进行排序,然后您将不再获得连续相同的数字。

有关如何根据索引(仅使用0)对列表列表进行排序,请参阅此https://stackoverflow.com/a/4174955/7505395,因为所有内部列表都相同。

您也可以使用itertools - it hast things like TakeWhile - 如果使用

,看起来会更聪明

这会忽略连续的,只收集它们:

def grpByValue(lis):
    d = {}
    for key in lis:
        if key in d:
            d[key] += 1
        else:
            d[key] = 1
    print(d)    

    rv = []
    for k in d:
        if (d[k]<2): 
            continue
        rv.append([])
        for n in range(0,d[k]):
            rv[-1].append(k)
    return rv



data = [1,2,1,1,1,2,2,3,4,4,4,4,5,4]

print grpByValue(data) 

输出:

[[1, 1, 1, 1], [2, 2, 2], [4, 4, 4, 4, 4]]

答案 2 :(得分:1)

你可以用列表理解来做到这一点:

A = [1,1,1,2,2,3,3,3]
B = []
[B.append([n]*A.count(n)) for n in A if B.count([n]*A.count(n)) == 0]

输出[[1,1,1],[2,2],[3,3,3]]

或更诡异:

A = [1,2,2,3,4,1,1,2,2,2,3,3,4,4,4]
B = []
for n in A:
    if B.count([n]*A.count(n)) == 0:
        B.append([n]*A.count(n))

输出[[1,1,1],[2,2,2,2,2],[3,3,3],[4,4,4,4]]

使用已排序或未排序的列表,如果您需要事先对列表进行排序,可以执行for n in sorted(A)

答案 3 :(得分:1)

这是Counter()的工作。迭代每个元素x,并检查A.count(x)具有O(N ^ 2)复杂度。 Counter()将计算迭代中每个元素在一次传递中存在的次数,然后您可以通过迭代该字典来生成结果。

>>> from collections import Counter
>>> A = [2,2,1,1,3,2]
>>> counts = Counter(A)
>>> result = [[key] * value for key, value in counts.items() if value > 1]
>>> result
[[2, 2, 2], [[1, 1]]