根据Python中的规则将所有字符串更改为整数

根据Python中的规则将所有字符串更改为整数,python,string,Python,String,我有一个包含string元素的数组,例如: [['2', '1', '1', '1', '4'] ['4', '3', '3', '5', '6'] ['7', '7', '2', '2', '7']] 我想用integer元素得到如下结果: [[0,0,0,0,0] [0,0,0,1,1] [1,1,0,0,1]] 根据规则,如果元素大于4,则替换为1else0 我尝试在Python中使用双循环,但它太复杂了,有没有简单的方法来完成这项工作?使用列表理解 >>> l =

我有一个包含
string
元素的数组,例如:

[['2', '1', '1', '1', '4']
['4', '3', '3', '5', '6']
['7', '7', '2', '2', '7']]
我想用
integer
元素得到如下结果:

[[0,0,0,0,0]
[0,0,0,1,1]
[1,1,0,0,1]]
根据规则,如果元素大于4,则替换为
1
else
0


我尝试在Python中使用双循环,但它太复杂了,有没有简单的方法来完成这项工作?

使用列表理解

>>> l = [['2', '1', '1', '1', '4'],
['4', '3', '3', '5', '6'],
['7', '7', '2', '2', '7']]
>>> [[1 if int(j) > 4 else 0 for j in i] for i in l]
[[0, 0, 0, 0, 0], [0, 0, 0, 1, 1], [1, 1, 0, 0, 1]]
传统的方式

final_list = []
for item in l:
    inner_list = []
    for inner_item in item:
        if int(inner_item) > 4:
            inner_list.append(1)
        else:
            inner_list.append(0)
    final_list.append(inner_list)

print final_list
另一种方式

x = [['2', '1', '1', '1', '4'],
['4', '3', '3', '5', '6'],
['7', '7', '2', '2', '7']]

z = [map(lambda i: 1 if i > '4' else 0, y) for y in x]

print(z)
这显然只适用于数组中的所有值都是单个数字的情况
'11'>'4'
返回
False
,这不是您想要的


如果知道数组中的任何值可能是
'10'
或更高,则有必要在比较
>4
(现在也是4是整数而不是字符串)之前对值应用整数转换。

假设输入列表名为
inp
双for循环运行良好:

out = [[0 for col in row] for row in inp]
for i, row in enumerate(inp):
    for j, value in enumerate(row):
        out[i][j] =  int(int(value) > 4)
或者,如果您想要一个没有for循环(但可读性较差)的功能路由:


保持列表为list1,然后使用lambda和map来解决这个问题。我们还必须使用if-else语句。 最后,将它们保存在另一个列表中作为列表2,然后打印。
您将获得它。

for
循环也将实现此功能:

>>> l
[['2', '1', '1', '1', '4'], ['4', '3', '3', '5', '6'], ['7', '7', '2', '2', '7']]
>>> lout
[]
>>> for i,_ in enumerate(l):
    lout.append([])
    for j in range(len(_)):
        lout[i].append(1 if int(l[i][j]) > 4 else 0)
>>> lout
[[0, 0, 0, 0, 0], [0, 0, 0, 1, 1], [1, 1, 0, 0, 1]]

我会使用一个双
for
循环。它只有两个循环。我也会发布我的尝试…对你真的很有帮助@FlyingMouse我不太喜欢这种语法。为了可读性,我仍然会使用双
for
循环。但我想这是主观的。@Kris你可以从我的回答中看出。。就像我在l中为i:为j在i:如果..我听到了。这只是对几行代码的大量封装。一般来说,当你在循环中有逻辑时,我个人认为一行是个坏主意。错误往往更容易发生。也许不是来自你,而是来自代码库中的其他人。不管怎样,这就是答案!
map(lambda y:  map(lambda x: int(int(x) > 4), y), inp)
>>> l
[['2', '1', '1', '1', '4'], ['4', '3', '3', '5', '6'], ['7', '7', '2', '2', '7']]
>>> lout
[]
>>> for i,_ in enumerate(l):
    lout.append([])
    for j in range(len(_)):
        lout[i].append(1 if int(l[i][j]) > 4 else 0)
>>> lout
[[0, 0, 0, 0, 0], [0, 0, 0, 1, 1], [1, 1, 0, 0, 1]]