Python:One-liner对2d数组(列表列表)中的元素执行操作?

时间:2011-06-17 05:20:04

标签: python arrays matrix 2d operation

我有一个列表列表,每个列表包含不同数量的字符串。我想(有效地)将这些全部转换为整数,但感觉有点密集,因为我无法让它为我的生活而努力。我一直在努力:     newVals = [int(x)for x in [row for values in values]]

其中'values'是列表列表。它一直说x是一个列表,因此如果是int()则不能成为参数。显然我在这里做了些蠢事,这是什么?对于这种事情,有没有被接受的习语?

像往常一样,提前感谢。

6 个答案:

答案 0 :(得分:12)

这使得int嵌套

[map(int, x) for x in values]

如果你想让它们变平,那就不难了

for Python3 map()返回一个迭代器。你可以用

[list(map(int, x)) for x in values]

但在这种情况下你可能更喜欢使用嵌套的LC

[[int(y) for y in x] for x in values]

答案 1 :(得分:9)

怎么样:

>>> a = [['1','2','3'],['4','5','6'],['7','8','9']]
>>> [[int(j) for j in i] for i in a]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

答案 2 :(得分:1)

您只是使用不正确的顺序和括号 - 应该是:

inputVals = [['1','2','3'], ['3','3','2','2']]
[int(x) for row in inputVals for x in row]

或者如果你需要输出列表,那么:

map(lambda row: map(int, row), inputVals)

答案 3 :(得分:0)

一种丑陋的方式是使用evalf:

>>> eval(str(a).replace("'",""))
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

如果你不介意在一个阵列中的所有数字,你可以去:

>>> a = [['1','2','3'],['4','5','6'],['7','8','9']]
>>> map(int,sum(a,[]))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

答案 4 :(得分:0)

另一种解决方法

a = [[1, 2, 3], [7, 8, 6]]
list(map(lambda i: list(map(lambda j: j - 1, i)), a))
[[0, 1, 2], [6, 7, 5]] #output

答案 5 :(得分:0)

为了映射具有任意数量维度的列表,您可以使用 numpy.apply_over_axes

import numpy as np
np.apply_over_axes(lambda x,_:x*2, np.array([[1,2,3],[5,2,1]]),[0])
--------------------
array([[ 2,  4,  6],
       [10,  4,  2]])

不幸的是,如果您还需要更改变量类型,这将不起作用。没有为此找到任何库解决方案,因此这里是执行此操作的代码:

def map_multi_dimensional_list(l, transform):
    if type(l) == list and len(l) > 0:
        if type(l[0]) != list:
            return [transform(v) for v in l]
        else:
            return [map_multi_dimensional_list(v, transform) for v in l]
    else:
        return []
            
map_multi_dimensional_list([[[1,2,3],[5,2,1]],[[10,20,30],[50,20,10]]], lambda x:x*2)
------------------
[[[2, 4, 6], [10, 4, 2]], [[20, 40, 60], [100, 40, 20]]]