簡體   English   中英

分組列表的重復元素

[英]Group repeated elements of a list

我正在嘗試創建一個函數,該函數接收一個列表並返回包含重復元素的另一個列表。

例如,對於輸入A = [2,2,1,1,3,2] (列表未排序),該函數將返回result = [[1,1], [2,2,2]] 結果不需要排序。

我已經在Wolfram Mathematica中做到了,但是現在我必須將其轉換為python3,Mathematica具有一些功能,例如Select,Map和Split,這使得它非常簡單,而無需使用帶有很多指令的長循環。

result = [[x] * A.count(x) for x in set(A) if A.count(x) > 1]

簡單方法:

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]]

如果想要對輸出進行排序或對輸入列表進行排序,則可以對輸出進行排序,但是以后將不再獲得連續的相同數字。

請參閱此https://stackoverflow.com/a/4174955/7505395 ,了解如何根據索引對列表列表進行排序(只需使用0),因為所有內部列表都是相同的。

您還可以使用itertools-它具有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]]

您可以通過列表理解來做到這一點:

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]]

或更Python地:

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)

這是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]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM