2012-10-26 31 views
6

Tôi có một danh sách lưu trữ được phối hợp trong python A[row,col,value] để lưu trữ các giá trị không phải 0.Các mục đầu tiên trong danh sách bên trong hiệu quả nhất có thể

Làm cách nào để có danh sách tất cả các chỉ mục hàng? Tôi mong đợi điều này A[0:][0] để làm việc như print A[0:] in toàn bộ danh sách nhưng print A[0:][0] chỉ in A[0].

Lý do tôi yêu cầu là tính toán hiệu quả số giá trị khác 0 trong mỗi hàng tức là lặp qua range(0,n) trong đó n là tổng số hàng. Số tiền này phải nhiều hơn rẻ hơn so với cách hiện tại của tôi là for i in range(0,n): for j in A: ....

Cái gì như:

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:

Sử dụng câu trả lời Junuxx của, this questionthis post tôi đã đưa ra sau (đối với trả lại số hàng đơn) nhanh hơn nhiều kích thước vấn đề hiện tại của tôi là A so với nỗ lực ban đầu của tôi. Tuy nhiên nó vẫn phát triển với số hàng và cột. Tôi tự hỏi liệu có thể không phải lặp lại trên A nhưng chỉ tối đa 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] 
+1

@larsman: Tôi giả sử A là một danh sách ba. – Junuxx

+0

Có, bạn đã hiểu. –

+1

Bạn có thể viết một ví dụ làm việc đơn giản, không hiệu quả về những gì bạn đang cố gắng làm không? Tôi tìm thấy những từ ngữ của câu hỏi thực sự khó hiểu, và không ai trong số các khối mã ví dụ của bạn dường như làm điều tương tự ..? – dbr

Trả lời

10

này nên làm điều đó:

c = [x[0] for x in A] 

Đó là một sự hiểu biết danh sách đó có các yếu tố (phụ) đầu tiên của mọi phần tử của A.

+0

Điều này thực hiện tốt hơn nhiều so với giải pháp ban đầu của tôi. Xin vui lòng xem chỉnh sửa của tôi, là nó có thể không lặp qua A mặc dù? Nhiều đánh giá cao! –

+0

Nếu A là rất lớn nhưng các thành phần của A chỉ có ba thành viên, có thể hiệu quả hơn để lưu trữ ba danh sách, 'hàng',' cột' và 'giá trị'. Bạn sẽ có thể nhận được tất cả các số hàng ngay lập tức và vẫn có thể truy cập một mục nhập bằng cách sử dụng cùng một chỉ mục cho cả ba danh sách (chúng được căn chỉnh). Nếu cả A và sublist đều dài, có thể tốt hơn nếu sử dụng cấu trúc dữ liệu hai chiều đúng như được cung cấp bởi numpy (xem câu trả lời của Jon Clements) thay vì các danh sách lồng nhau. – Junuxx

4

Đối efficieny và lát mở rộng, bạn có thể sử dụng numpy - mà đưa ví dụ của bạn có vẻ như là một ý tưởng tốt:

import numpy as np 
yourlist = [ 
    [0, 0, 0], 
    [0, 1, 1], 
    [1, 0, 2] 
] 
a = np.array(yourlist) 
print a[:,0] 
# [0 0 1] 
bc = np.bincount(a[:,0]) 
# array([2, 1]) 
count = bc[bc==1].size 
# 1 
# or... (I think it's probably better...) 
count = np.count_nonzero(bc == 1) 
+0

Tôi không thể lấy ví dụ của bạn để làm việc .. 'type (mylist [0] [0])' trả về 'int',' type (a [0] [0]) 'trả về' numpy.float64' sau 'a = numpy.array (mylist) 'khi tôi thử' bincount (a [:, 0]) 'Tôi nhận được' TypeError: mảng không thể được an toàn đúc thành kiểu bắt buộc' Tôi đã thử 'bc = numpy.bincount (numpy.arange (a [:, 0], dtype = numpy.int)) 'và lỗi là' TypeError: chỉ mảng dài-1 có thể được chuyển đổi thành các scalars Python ' –

+0

@sudo_o Không chắc chắn nên nói gì về điều đó - sau 'np.array' (không phải' np.arange') tôi kết thúc với 'type (a [0] [0])' và mọi thứ khác chỉ hoạt động ... –

Các vấn đề liên quan