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

时间:2016-01-08 06:14:19

标签: 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,则替换为1 else 0

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

6 个答案:

答案 0 :(得分:5)

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

>>> [[(1 if int(num)>4 else 0) for num in row] for row in L]

[[0, 0, 0, 0, 0], [0, 0, 0, 1, 1], [1, 1, 0, 0, 1]]

答案 1 :(得分:2)

使用列表理解。

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

答案 2 :(得分:2)

像这样的另一种方式

 logging.basicConfig(level=logging.INFO)

    logging.getLogger('suds.client').setLevel(logging.INFO)
    logging.getLogger('suds.transport').setLevel(logging.INFO) 
    logging.getLogger('suds.xsd.schema').setLevel(logging.INFO)
    logging.getLogger('suds.wsdl').setLevel(logging.INFO)
    logging.getLogger('suds.resolver').setLevel(logging.INFO)
    logging.getLogger('suds.xsd.query').setLevel(logging.INFO)
    logging.getLogger('suds.xsd.sxbasic').setLevel(logging.INFO)
    logging.getLogger('suds.xsd.sxbase').setLevel(logging.INFO)
    logging.getLogger('suds.metrics').setLevel(logging.INFO)
    logging.getLogger('suds.binding.marshaller').setLevel(logging.INFO)

这显然只有在数组中的所有值都是单个数字时才有效。 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是整数而不是字符串)比较。

答案 3 :(得分:1)

假设您的输入列表被调用inp 双循环效果很好:

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循环(但可读性较差)的功能路由:

map(lambda y:  map(lambda x: int(int(x) > 4), y), inp)

答案 4 :(得分:1)

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

答案 5 :(得分:0)

将列表保留为list1,然后使用lambda和map来解决此问题。而且我们还必须使用if else语句。 Atlast,将它们作为list2保存在另一个列表中,然后打印出来。 你会得到它..