Python列表由元组索引

时间:2010-01-20 02:32:26

标签: python list matlab list-comprehension

我是一个需要在某些事情上使用Python的Matlab用户,如果有人可以帮我解决Python语法,我将非常感激:

(1)是否可以通过Python中的元组索引列表?如果是这样,我该怎么做?例如,我想用它来表示数据矩阵。

(2)假设我可以使用由元组索引的列表,比如数据[(row,col)],如何删除整个列?我知道在Matlab中,我可以做类似

的事情
 new_data = [data(:,1:x-1) data(:,x+1:end)];

如果我想从数据中删除列x。

(3)如何轻松计算每行中非负元素的数量。例如,在Matlab中,我可以这样做:

 sum(data>=0,1)

这会给我一个列向量,表示每行中的非负数条目。

非常感谢!

7 个答案:

答案 0 :(得分:8)

你应该研究numpy,这是为了这种事情。

答案 1 :(得分:3)

  1. 不,但是dicts可以。
  2. 听起来像你想要一个“二维数组”,矩阵类型或其他东西。你看过numpy了吗?
  3. 取决于你从#2中选择什么,但Python确实有sum和其他直接在迭代上工作的函数。查看gen-exprs(生成器表达式)和列表推导。例如:
  4. row_count_of_non_neg = sum(1 for n in row if n >= 0)
    # or:
    row_count_of_non_neg = sum(n >= 0 for n in row)
    # "abusing" True == 1 and False == 0
    

答案 2 :(得分:2)

以下是如何在numpy中轻松创建数组(矩阵)的示例:

>>> import numpy
>>> a = numpy.array([[1,2,3],[4,5,6],[7,8,9]])

这是如何显示

>>> a
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

以及如何获取行或列:

>>> a[0,:]
array([1, 2, 3])
>>> a[:,0]
array([1, 4, 7])

希望示例中的语法清晰! Numpy相当强大。

答案 3 :(得分:2)

我同意所有人的意见。使用Numpy / Scipy。但这里是您问题的具体答案。

  1. 是。索引可以是内置列表,也可以是Numpy数组。假设x = scipy.array([10, 11, 12, 13])y = scipy.array([0, 2])。然后x[[0, 2]]x[y]都返回相同的内容。

  2. new_data = scipy.delete(data, x, axis=0)

  3. (data>=0).sum(axis=1)

  4. 小心:示例2说明了Numpy / Scipy常见的陷阱。如例3所示,axis属性通常设置为0以沿阵列的第一维操作,1设置为沿第二维操作,依此类推。但是像delete这样的命令实际上颠倒了维度的顺序,如例2所示。你知道,行主要与列主要有关。

答案 4 :(得分:1)

您可以通过重载内置列表的__getitem__和__setitem__方法来扩展列表功能以允许使用元组进行索引。请尝试以下代码:

class my_list(list):
    def __getitem__(self, key):
        if isinstance(key, tuple) and len(key) > 0:
            temp = []
            for k in key: temp.append(list.__getitem__(self, k))
            return temp
        else:
            return list.__getitem__(self, key)

    def __setitem__(self, key, data):
        if isinstance(key, tuple) and len(key) > 0:
            for k in key: list.__setitem__(self, k, data)
        else:
            list.__setitem__(self, key, data)


if __name__ == '__main__':
   L = my_list([1, 2, 3, 4, 5])
   T = (1,3)
   print(L[T]) 

答案 5 :(得分:0)

(1) 我认为你不能使用元组作为python列表的索引。您可以使用列表列表(例如[i] [j]),但似乎这不是您的观点。您可以使用其键为元组的字典。

d = { (1,1):1, (2,1):2  ... } 

(2) 如果你不介意表现,

map( lambda x: d.remove(x) if x[1] = col_number, d.keys() )

(3) 您也可以使用过滤器来执行此操作。

sum(
map( lambda x:x[1], filter(lambda x,y: x[1] == row_num and y > 0, d.items()))
)

答案 6 :(得分:0)

不,不是一个列表可以被除整数之外的任何东西索引的情况。然而,字典是另一种情况。字典是包含键值对的哈希表。密钥必须是唯一且不可变的。值可以是任何类型的对象,包括整数,元组,列表或其他字典。对于您的示例,元组可以作为键,因为它们是不可变的。另一方面,列表不是,因此也不能是字典键。

您提出的一些功能可以实现为字典和列表推导的组合。其他人则需要对字典进行子类化并添加方法来实现所需的功能。