嵌套列表的元素明智检查

时间:2019-04-25 18:33:22

标签: python nested-lists elementwise-operations

逐元素检查嵌套列表是否存在多个条件,如果不满足或满足条件,则返回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]

4 个答案:

答案 0 :(得分:2)

有一个更快的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]]

答案 1 :(得分:1)

您可以像这样通过列表理解来做到这一点:

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

答案 2 :(得分:0)

就您的示例而言,可以通过一些映射来完成。

验证数字的最后一位是否等于数字的方法是对数字应用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]]

答案 3 :(得分: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)

这些答案实际上是相同的算法。