7

我在 python 中有一个协调的存储列表, A[row,col,value]用于存储非零值。

如何获取所有行索引的列表?我希望这A[0:][0]可以print A[0:]打印整个列表,但print A[0:][0]只打印A[0].

我问的原因是为了有效计算每行中非零值的数量,迭代range(0,n)其中 n 是总行数。这应该比我目前的方式便宜for i in range(0,n): for j in A: ...得多。

就像是:

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

超过:

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

编辑:

使用 Junuxx 的答案、这个问题这篇文章,我想出了以下内容(用于返回单例行的数量)A ,这对于我当前的问题大小来说比我最初的尝试要快得多。然而,它仍然随着行数和列数的增加而增长。我想知道是否有可能不必迭代A而只是 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]
4

2 回答 2

15

这应该这样做:

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

这是一个列表推导式,它采用A.

于 2012-10-26T09:52:04.263 回答
4

对于效率和扩展切片,您可以使用numpy- 鉴于您的示例,这似乎是一个好主意:

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)
于 2012-10-26T11:14:15.533 回答