Python:一行代码在二维数组(列表的列表)中执行操作的方法?

15

我有一个列表嵌套列表的数据结构,每个列表包含不同数量的字符串。我希望(高效地)把它们全部转换成整数,但是我感觉有点愚蠢,因为我无论如何都不能让它正常工作。我一直在尝试以下代码:

newVals = [int(x) for row in values for x in row]

这里的“values”是嵌套列表。它一直报错说x是一个列表,因此int()函数不能接受它作为参数。显然我在这里做了一些愚蠢的事情,那是什么?有没有固定的惯用方法可以解决这种问题?

6个回答

22

这会让整数嵌套

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

如果你想要它们被压平,那也不难

对于Python3,map()返回一个迭代器。你可以使用

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

但在那种情况下,您可能更喜欢使用嵌套的LC。

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

10

如何这样处理:

>>> 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]]

3
另一个解决办法。
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

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)

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]]]

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接