嵌套列表的元素明智检查
element wise checking of nested list
按元素检查嵌套列表的多个条件,return如果不满足或满足条件则为 0 或 1。
我必须检查
至少 14
不能等于=19
如果元素以 4 或 9 结尾
例如年龄数组
[[22, 13, 31, 13],
[17, 14, 24, 22]]
将输出数组为
[[0, 0, 0, 0],
[0, 1, 1, 0]]
我试过展平列表然后检查每个条件,但它不起作用。
flat_list = [item for sublist in age for item in sublist]
x=14
[not x for x in flat_list]
你可以像这样用列表推导来做到这一点:
somelist = [[22, 13, 31, 13],
[17, 14, 24, 22]]
result = [[1 if (x%10==4 or x%10==9) and (x>=14 and x!=19) else 0 for x in sublist] for sublist in somelist]
result
[[0, 0, 0, 0], [0, 1, 1, 0]]
其中 x%10
将获取每个数字的最后一位,允许直接比较。通过将这两个条件分组,您可以更有逻辑地列出您想要做的事情,尽管这对于列表理解来说有点混乱。
更好的方法(以牺牲速度为代价)可能是使用 map
:
def check_num(num):
value_check = num >= 14 and num != 19
last_num_check = num % 10 == 4 or num % 10 == 9
return int(value_check and last_num_check)
somelist = [[22, 13, 31, 13],
[17, 14, 24, 22]]
result = [[x for x in map(check_num, sublist)] for sublist in somelist]
result
[[0, 0, 0, 0], [0, 1, 1, 0]]
计时操作之间的差异:
列表理解
python -m timeit -s 'somelist = [[22, 13, 31, 13], [17, 14, 24, 22]]' '[[1 if (x%10==4 or x%10==9) and (x>=14 and x!=19) else 0 for x in sublist] for sublist in somelist]'
1000000 loops, best of 3: 1.35 usec per loop
地图
python -m timeit -s 'from somefunc import check_num; somelist = [[22, 13, 31, 13], [17, 14, 24, 22]]' '[[x for x in map(check_num, sublist)] for sublist in somelist]'
100000 loops, best of 3: 3.37 usec per loop
就您的示例而言,它可以通过一些映射来完成。
验证最后一位数字是否等于数字的方法是对数字应用模 10。
my_list = [[22, 13, 31, 13],[17, 14, 24, 22]]
result_list = []
for sublist in my_list:
result_list.append(list(map(lambda x: 1 if x % 10 == 4 and x >= 14 and x != 19 else 0, sublist)))
print(result_list)
将产生:
[[0, 0, 0, 0], [0, 1, 1, 0]]
C.Nvis 有一个很好的列表理解答案。您也可以使用嵌套 for 循环解决此问题
def is_valid(x):
return (x == 14) or (x%10 == 4) or (x%10 == 9)
out = []
for sublist in matrix:
out_sublist = []
for i in sublist:
if (is_valid(i)):
out_sublist.append(1)
else:
out_sublist.append(0)
out.append(out_sublist)
print(out)
这些答案实际上是相同的算法。
有一个更快的 numpy 解决方案:
((arr >= 14) & (arr != 19) & ((arr%10 == 4) | (arr%10==9))).astype(int)
代码:
import numpy as np
arr = np.array([[22, 13, 31, 13],
[17, 14, 24, 22]])
print(((arr >= 14) & (arr != 19) & ((arr%10 == 4) | (arr%10==9))).astype(int))
# [[0 0 0 0]
# [0 1 1 0]]
按元素检查嵌套列表的多个条件,return如果不满足或满足条件则为 0 或 1。
我必须检查
至少 14
不能等于=19
如果元素以 4 或 9 结尾
例如年龄数组
[[22, 13, 31, 13],
[17, 14, 24, 22]]
将输出数组为
[[0, 0, 0, 0],
[0, 1, 1, 0]]
我试过展平列表然后检查每个条件,但它不起作用。
flat_list = [item for sublist in age for item in sublist]
x=14
[not x for x in flat_list]
你可以像这样用列表推导来做到这一点:
somelist = [[22, 13, 31, 13],
[17, 14, 24, 22]]
result = [[1 if (x%10==4 or x%10==9) and (x>=14 and x!=19) else 0 for x in sublist] for sublist in somelist]
result
[[0, 0, 0, 0], [0, 1, 1, 0]]
其中 x%10
将获取每个数字的最后一位,允许直接比较。通过将这两个条件分组,您可以更有逻辑地列出您想要做的事情,尽管这对于列表理解来说有点混乱。
更好的方法(以牺牲速度为代价)可能是使用 map
:
def check_num(num):
value_check = num >= 14 and num != 19
last_num_check = num % 10 == 4 or num % 10 == 9
return int(value_check and last_num_check)
somelist = [[22, 13, 31, 13],
[17, 14, 24, 22]]
result = [[x for x in map(check_num, sublist)] for sublist in somelist]
result
[[0, 0, 0, 0], [0, 1, 1, 0]]
计时操作之间的差异:
列表理解
python -m timeit -s 'somelist = [[22, 13, 31, 13], [17, 14, 24, 22]]' '[[1 if (x%10==4 or x%10==9) and (x>=14 and x!=19) else 0 for x in sublist] for sublist in somelist]'
1000000 loops, best of 3: 1.35 usec per loop
地图
python -m timeit -s 'from somefunc import check_num; somelist = [[22, 13, 31, 13], [17, 14, 24, 22]]' '[[x for x in map(check_num, sublist)] for sublist in somelist]'
100000 loops, best of 3: 3.37 usec per loop
就您的示例而言,它可以通过一些映射来完成。
验证最后一位数字是否等于数字的方法是对数字应用模 10。
my_list = [[22, 13, 31, 13],[17, 14, 24, 22]]
result_list = []
for sublist in my_list:
result_list.append(list(map(lambda x: 1 if x % 10 == 4 and x >= 14 and x != 19 else 0, sublist)))
print(result_list)
将产生:
[[0, 0, 0, 0], [0, 1, 1, 0]]
C.Nvis 有一个很好的列表理解答案。您也可以使用嵌套 for 循环解决此问题
def is_valid(x):
return (x == 14) or (x%10 == 4) or (x%10 == 9)
out = []
for sublist in matrix:
out_sublist = []
for i in sublist:
if (is_valid(i)):
out_sublist.append(1)
else:
out_sublist.append(0)
out.append(out_sublist)
print(out)
这些答案实际上是相同的算法。
有一个更快的 numpy 解决方案:
((arr >= 14) & (arr != 19) & ((arr%10 == 4) | (arr%10==9))).astype(int)
代码:
import numpy as np
arr = np.array([[22, 13, 31, 13],
[17, 14, 24, 22]])
print(((arr >= 14) & (arr != 19) & ((arr%10 == 4) | (arr%10==9))).astype(int))
# [[0 0 0 0]
# [0 1 1 0]]