Python 内部列表中的第一项尽可能有效

Python 内部列表中的第一项尽可能有效,python,list,optimization,performance,Python,List,Optimization,Performance,我在python中有一个协调存储列表a[row,col,value]用于存储非零值 如何获取所有行索引的列表?我希望这个A[0:[0]可以像print A[0:][/code>那样打印整个列表,但是print A[0:[0]只打印A[0] 我要求的原因是为了有效计算每行中非零值的数量,即迭代范围(0,n),其中n是总行数。对于范围(0,n)中的i:A中的j,这应该比我目前使用的方法便宜得多:… 比如: c = [] # for the total number of rows for i in

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

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

我要求的原因是为了有效计算每行中非零值的数量,即迭代
范围(0,n)
,其中n是总行数。对于范围(0,n)中的i:A中的j,这应该比我目前使用的
方法便宜得多:…

比如:

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
超过:

编辑:

使用Junuxx的答案,我得出了以下结果(用于返回单例行数),这对于我当前的
A
问题来说比我最初的尝试要快得多。但是,它仍然会随着行数和列数的增加而增加。我想知道是否有可能不必迭代
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]
这应该做到:

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

这是一个列表理解,它采用
a

的每个元素的第一个(子)元素。为了提高效率和扩展切片,您可以使用
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)

@拉斯曼:我假设A是一个三元组的列表。你能写一个简单、低效、有效的例子来说明你在做什么吗?我发现这个问题的措辞确实令人困惑,而且您的示例代码块似乎都没有做相同的事情..?我正在计算坐标存储列表中仅包含1个非零值的所有行。只有第二个代码块略有不同,因为它返回了每行的计数。我已经用注释更新了代码。这比我原来的解决方案性能要好得多。请看我的编辑,有没有可能不迭代一次呢?非常感谢!如果A非常大,但A的元素只有三个成员,那么存储三个列表,
可能更有效。您将能够立即获得所有行号,并且仍然可以通过对所有三个列表使用相同的索引来访问单个条目(它们是对齐的)。如果A和子列表都很长,那么最好使用真正的二维数据结构,如numpy提供的数据结构(参见Jon Clements的回答),而不是嵌套列表。我无法让您的示例工作
type(mylist[0][0])
返回
int
type(a[0][0])
返回
numpy.float64
after
a=numpy.array(mylist)
当我尝试
bincount(a[:,0])
我得到
TypeError:array无法安全地强制转换为所需的类型
错误是
类型错误:只有长度为1的数组可以转换为Python标量
@sudo\o不知道该怎么说-在
np.array
之后(不是
np.arange
),我最终得到了
类型(a[0][0])
,其他一切都正常了。。。
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)