Mam skoordynowaną listę pamięci w pythonie A[row,col,value]
do przechowywania wartości zerowych.Pierwsze pozycje na liście wewnętrznej sprawnie, jak to możliwe
Jak mogę uzyskać listę wszystkich indeksów wierszy? Spodziewałem się, że ta A[0:][0]
zadziała, gdy print A[0:]
wydrukuje całą listę, ale print A[0:][0]
drukuje tylko .
Powód, dla którego pytam, to efektywne obliczenie liczby niezerowych wartości w każdym wierszu , tj. iterowanie po range(0,n)
, gdzie n jest całkowitą liczbą rzędów. To powinno być o wiele tańsze: niż moja obecna metoda for i in range(0,n): for j in A: ...
.
Coś jak:
c = []
# for the total number of rows
for i in range(0,n):
# get number of rows with only one entry in coordinate storage list
if A[0:][0].count(i) == 1: c.append(i)
return c
Over:
c = []
# for the total number of rows
for i in range(0,n):
# get the index and initialize the count to 0
c.append([i,0])
# for every entry in coordinate storage list
for j in A:
# if row index (A[:][0]) is equal to current row i, increment count
if j[0] == i:
c[i][1]+=1
return c
EDIT:
Korzystanie odpowiedź Junuxx'S, this question i this post wymyśliłem następujący (na powrocie numer z pojedynczych wierszy), który jest znacznie szybszy dla moje bieżące problemy mają rozmiar A
niż moja pierwotna próba. Jednak wciąż rośnie wraz z liczbą wierszy i kolumn. Zastanawiam się, czy jest możliwe, aby nie trzeba iterować ponad A
, ale po prostu upto n
?
# get total list of row indexes from coordinate storage list
row_indexes = [i[0] for i in A]
# create dictionary {index:count}
c = Counter(row_indexes)
# return only value where count == 1
return [c[0] for c in c.items() if c[1] == 1]
@larsman: Zakładam, że A jest lista trójek. – Junuxx
Tak, masz to. –
Czy możesz napisać prosty, nieefektywny, działający przykład tego, co próbujesz zrobić? Uważam, że sformułowanie pytania jest naprawdę mylące i żaden z twoich przykładowych bloków kodu nie robi tego samego ...? – dbr