我正在尝试创建一个接收列表的函数,并返回带有重复元素的另一个列表。
例如输入A = [2,2,1,1,3,2]
(列表未排序),函数将返回result = [[1,1], [2,2,2]]
。结果不需要排序。
我已经在Wolfram Mathematica中完成了它,但现在我必须将它翻译成python3,Mathematica有一些功能,如Select,Map和Split,这使得它非常简单,不需要使用带有大量指令的长循环。
答案 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]]