2016-11-03 4 views
0

Ich habe eine Liste l1, die aussieht wie [1,2,1,0,1,1,0,3 ..]. Ich möchte für jedes Element die Indizes von Elementen finden, die denselben Wert wie das Element haben.So finden Sie allgemeine Elemente in einer Liste

ZB für den ersten Wert in der Liste, 1, sollte es alle Indizes auflisten, wobei 1 in der Liste vorhanden ist, und es sollte dasselbe für jedes Element in der Liste wiederholen. Ich kann eine Funktion schreiben, die das durch die Liste iteriert, aber prüfen wollte, ob es eine vordefinierte Funktion gibt.

ich die Liste bin immer von Pandas Datenrahmen Spalten, wäre es gut, wenn Know-Serie/Datenrahmen Bibliothek, solche Funktionen bieten

+0

Es würde viel helfen, wenn Sie die Funktion zeigen Sie geschrieben und die erwartete Ausgabe. Ich habe Probleme herauszufinden, wenn Sie nur die Elemente wollen, die ihren Indizes entsprechen, oder ein zweidimensionales Objekt, das die Indizes der Elemente für jede Position enthält. – chthonicdaemon

Antwort

1

Sie numpy.unique verwenden können, die die inverse auch zurückgeben kann. Dies kann dazu verwendet werden, um die Indizes zu rekonstruieren numpy.where mit:

In [49]: a = [1,2,1,0,1,1,0,3,8,10,6,7] 

In [50]: uniq, inv = numpy.unique(a, return_inverse=True) 

In [51]: r = [(uniq[i], numpy.where(inv == i)[0]) for i in range(uniq.size)] 

In [52]: print(r) 
[(0, array([3, 6])), (1, array([0, 2, 4, 5])), (2, array([1])), (3, array([7])), (6, array([10])), (7, array([11])), (8, array([8])), (10, array([9]))] 
1

ich versuchte Brute sein force..may u optimieren

hier ist python3 Code

L = [1,2,1,0,1,1,0,3] 
D = dict() 
for i in range(len(L)): 
    n =[] 
    if L[i] not in D.keys(): 
     for j in range(len(L)): 
      if L[i] == L[j]: 
       n.append(j) 
     D[L[i]] = n 
for j in D.keys(): 
    print(j,"->",D.get(j)) 
+0

Sie sollten nur einmal über die Eingabeliste iterieren, nicht ein Mal für jedes Element in der Eingabeliste. Wie geschrieben, skaliert dieser Algorithmus als O (n^2), was nicht groß ist. –

0

können Sie auch versuchen, etwas wie dies:

import pandas as pd 
df = pd.DataFrame({'A': [1,2,1,0,1,1,0,3]}) 
uni = df['A'].unique() 
for i in uni: 
    lists = df[df['A'] == i].index.tolist() 
    print(i, '-->', lists) 

Ausgang:

1 --> [0, 2, 4, 5] 
2 --> [1] 
0 --> [3, 6] 
3 --> [7] 
0

Sie können dies mit einem defaultdict erreichen.

from collection import defaultdict 

input = [1,2,1,0,1,1,0,3] 
#Dictionary to store our indices for each value 
index_dict = defaultdict(list) 
#Store index for each item 
for i, item in enumerate(input): 
    index_dict[item].append(i) 

Wenn Sie eine Liste wollen, die die Indizes der Elemente enthält, die die gleiche wie das entsprechende Element in der Eingabeliste sind, können Sie einfach einen Verweis auf das Wörterbuch erstellen:

same_element_indices = [index_dict[x] for x in input] 

Dies hat der Vorteil, nur auf das eine Objekt für jedes identische Element zu verweisen.

Ausgabe wäre:

[[0, 2, 4, 5], 
[1], 
[0, 2, 4, 5], 
[3, 6], 
[0, 2, 4, 5], 
[0, 2, 4, 5], 
[3, 6], 
[7]] 
Verwandte Themen