[英]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.