2017-12-30 6 views
-1
n,m=map(int,input().split()) 
arr=[i%m for i in (map(int,(input().split())))] 

suppose n=5 und m =3 und Eingang array =[3, 2 ,1 ,4, 5] so arr=[0, 2, 1, 1, 2] in diesem Fall aber jetzt will ich effizient in einer Liste Elemente von gleichem Wert speichern, dh [1,1] und [2,2] .Was sind der beste Weg zu einer Gruppe ? sie zusammen effizient auch ich mag ihre Indizes am Ende soGruppierung gleiche Elemente in der Liste effizient

Ausgang: [[1,1], [2,2]] aus dem Index (2,3) und Index (1,4)

Was ich suche, sind die Indizes der ursprünglichen Array-Elemente, bevor moda genommen wird t haben den gleichen Wert nach dem Ausführen der Mod-Operation.

+0

Nein, es kann nicht in weniger als O (N) durchgeführt werden. Sie müssen alle Elemente einmal zur Gruppe durchlaufen. –

+0

Also, was wäre die erwartete Ausgabe? –

+0

Also '0' ist nicht enthalten, weil es einzigartig ist? Was wäre eine Eingabeliste von '[1, 2, 1, 1, 2]'? –

Antwort

3

set speichert nur eindeutige Werte

arr=[0, 2, 1, 1, 2] 
arr = [(s, arr.count(s)) for s in set(arr)] 
# [(0, 1), (1, 2), (2, 2)] 

Update (dank @JonClements)

s = {} 
for i, v in enumerate(arr): 
    s.setdefault(v % 3, []).append(i) 
print(s) 
# {0: [0], 1: [2, 3], 2: [1, 4]} 
+0

Das hätte mit counter too Counter (arr) gemacht werden können, aber das wird den Index nicht erhalten. Ich denke, ich habe es in der Frage nicht klargestellt, aber jetzt habe ich die Frage bearbeitet. Entschuldigen Sie. – Demonking28

+0

https://eval.in/928370 – splash58

+0

Anstelle des try/except - verwenden Sie 's.setdefault (v, []). Append (i)' –

Verwandte Themen