我有一个包含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中使用双循环,但它太复杂了,有没有简单的方法来完成这项工作?
答案 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保存在另一个列表中,然后打印出来。 你会得到它..