Python 在列表(数组)中拆分特定项的优雅方式?

Python 在列表(数组)中拆分特定项的优雅方式?,python,list,copy,Python,List,Copy,例如,我有一个只包含0、1和2的列表 ls = [ [1, 1, 0, 2, 2], [1, 1, 1, 2, 2, 2], [0, 1, 0, 0, 0, 2, 0] ] 我想把这个列表分成两个列表 ls1包含1,ls2包含2。我希望保留该形状,并使用0替换ls1中的2和ls2中的1。预期结果是: ls1 = [ [1, 1, 0, 0, 0], [1, 1, 1, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0] ] ls2 = [ [0, 0, 0, 2, 2], [0,

例如,我有一个只包含0、1和2的列表

ls = [
[1, 1, 0, 2, 2],
[1, 1, 1, 2, 2, 2],
[0, 1, 0, 0, 0, 2, 0]
]
我想把这个列表分成两个列表

ls1包含1,ls2包含2。我希望保留该形状,并使用0替换ls1中的2和ls2中的1。预期结果是:

ls1 = [
[1, 1, 0, 0, 0],
[1, 1, 1, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0]
]

ls2 = [
[0, 0, 0, 2, 2],
[0, 0, 0, 2, 2, 2],
[0, 0, 0, 0, 0, 2, 0]
]

我知道我可以使用for循环来处理它,但是有一种优雅的方法吗?

使用嵌套列表理解:

ls1 = [[1 if e == 1 else 0 for e in l] for l in ls]
ls2 = [[2 if e == 2 else 0 for e in l] for l in ls]

# ls1
[[1, 1, 0, 0, 0], 
 [1, 1, 1, 0, 0, 0], 
 [0, 1, 0, 0, 0, 0, 0]]

# ls2
[[0, 0, 0, 2, 2], 
 [0, 0, 0, 2, 2, 2], 
 [0, 0, 0, 0, 0, 2, 0]]
ls = [
[1, 1, 0, 2, 2],
[1, 1, 1, 2, 2, 2],
[0, 1, 0, 0, 0, 2, 0]
]

def keep_only(val, lst):
    return [[v if v==val else 0 for v in sublist] for sublist in lst]

ls1 = keep_only(1, ls)
ls2 = keep_only(2, ls)

使用嵌套列表理解:

ls1 = [[1 if e == 1 else 0 for e in l] for l in ls]
ls2 = [[2 if e == 2 else 0 for e in l] for l in ls]

# ls1
[[1, 1, 0, 0, 0], 
 [1, 1, 1, 0, 0, 0], 
 [0, 1, 0, 0, 0, 0, 0]]

# ls2
[[0, 0, 0, 2, 2], 
 [0, 0, 0, 2, 2, 2], 
 [0, 0, 0, 0, 0, 2, 0]]
ls = [
[1, 1, 0, 2, 2],
[1, 1, 1, 2, 2, 2],
[0, 1, 0, 0, 0, 2, 0]
]

def keep_only(val, lst):
    return [[v if v==val else 0 for v in sublist] for sublist in lst]

ls1 = keep_only(1, ls)
ls2 = keep_only(2, ls)

没有什么特别优雅的地方,但您可以简单地使用列表:

ls1 = [[1 if e == 1 else 0 for e in l] for l in ls]
ls2 = [[2 if e == 2 else 0 for e in l] for l in ls]

# ls1
[[1, 1, 0, 0, 0], 
 [1, 1, 1, 0, 0, 0], 
 [0, 1, 0, 0, 0, 0, 0]]

# ls2
[[0, 0, 0, 2, 2], 
 [0, 0, 0, 2, 2, 2], 
 [0, 0, 0, 0, 0, 2, 0]]
ls = [
[1, 1, 0, 2, 2],
[1, 1, 1, 2, 2, 2],
[0, 1, 0, 0, 0, 2, 0]
]

def keep_only(val, lst):
    return [[v if v==val else 0 for v in sublist] for sublist in lst]

ls1 = keep_only(1, ls)
ls2 = keep_only(2, ls)
输出:

print(ls1)
print(ls2)

# [[1, 1, 0, 0, 0], [1, 1, 1, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0]]
# [[0, 0, 0, 2, 2], [0, 0, 0, 2, 2, 2], [0, 0, 0, 0, 0, 2, 0]]

没有什么特别优雅的地方,但您可以简单地使用列表:

ls1 = [[1 if e == 1 else 0 for e in l] for l in ls]
ls2 = [[2 if e == 2 else 0 for e in l] for l in ls]

# ls1
[[1, 1, 0, 0, 0], 
 [1, 1, 1, 0, 0, 0], 
 [0, 1, 0, 0, 0, 0, 0]]

# ls2
[[0, 0, 0, 2, 2], 
 [0, 0, 0, 2, 2, 2], 
 [0, 0, 0, 0, 0, 2, 0]]
ls = [
[1, 1, 0, 2, 2],
[1, 1, 1, 2, 2, 2],
[0, 1, 0, 0, 0, 2, 0]
]

def keep_only(val, lst):
    return [[v if v==val else 0 for v in sublist] for sublist in lst]

ls1 = keep_only(1, ls)
ls2 = keep_only(2, ls)
输出:

print(ls1)
print(ls2)

# [[1, 1, 0, 0, 0], [1, 1, 1, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0]]
# [[0, 0, 0, 2, 2], [0, 0, 0, 2, 2, 2], [0, 0, 0, 0, 0, 2, 0]]

您的列表中只有0、1、2吗?@cs95是的,我更新了这个。您的列表中只有0、1、2吗?@cs95是的,我更新了这个。在这种情况下使用&操作非常聪明!在这种情况下,使用&操作非常智能!