从一个集合的列表理解,其元素是由两个元组组成的元组
List comprehension from a set whose elements are tuples composed of two tuples
我有一个巨大的元组列表,每个元组包含另外两个元组,例如
lst = [((0,2,1), (2,1,3)), ((3,2,1), (0,1,1)), ...]
此列表中的许多元素在某些条件下是不可接受的,我正在尝试创建一个由满足这些条件的元素组成的新列表。其中,我想删除那些左(resp.right)元组包含零但右(resp.left)元组在相同位置没有零的元素。还有那些左元组包含两个连续的非零数字(在给定范围内)并且位于右元组中与重复出现的位置相同的数字不是 1 的元素。为此,我尝试过:
acceptable_lst = [elem for elem in lst for j in range(3) if not ((elem[0][j] == 0 and
elem[1][j] != 0) or (j < 2 and elem[0][j] != 0 and elem[0][j] == elem[0][j+1]
and elem[1][j+1] != 1)]
当我将此代码应用于例如
lst = [((3,2,2), (1,2,3)),
((0,1,3), (2,2,3)),
((1,1,2), (3,3,3)),
((0,2,2), (3,3,3)),
((2,2,1), (3,1,3))]
我想得到:
acceptable_lst = [((2,2,1), (3,1,3))]
为什么? lst
中的第一个元素在左元组中的代表为2,第二个2在第三个位置,但右元组中的第三个元素不是1。第二个元素在第一个位置为零左元组的和右元组相同位置的非零,依此类推......只有lst
中的最后一个元素满足上述条件。
然而我得到的是
[((3, 2, 2), (1, 2, 3)),
((3, 2, 2), (1, 2, 3)),
((0, 1, 3), (2, 2, 3)),
((0, 1, 3), (2, 2, 3)),
((1, 1, 2), (3, 3, 3)),
((1, 1, 2), (3, 3, 3)),
((0, 2, 2), (3, 3, 3)),
((2, 2, 1), (3, 1, 3)),
((2, 2, 1), (3, 1, 3)),
((2, 2, 1), (3, 1, 3))]
这表明我的代码完全错误。我怎样才能实现我需要的东西?
检查函数的有效性
def valid(elemLeft, elemRight):
lastItem = None
for i in range(3):
if elemLeft[i] == 0 and elemRight[i] != 0:
return False
if lastItem != None:
if elemLeft[i] == lastItem and elemRight[i] != 1:
return False
lastItem = elemLeft[i]
return True
lst = [((3,2,2),(1,2,3)), ((0,1,3),(2,2,3)), ((1,1,2),(3,3,3)), ((0,2,2),(3,3,3)), ((2,2,1),(3,1,3))]
acceptable_lst = [elem for elem in lst if valid(elem[0],elem[1])]
print(acceptable_lst)
您在列表理解中执行了两个 for 循环。
[ elem for elem in lst for j in range(3) if condition ]
相当于:
out_list = []
for elem in lst:
for j in range(3):
if condition:
out_list.append(elem)
如果您必须为此任务使用列表理解,您可以修改它:
import numpy as np
acceptable_lst = [elem for elem in lst
if not (np.any([(elem[0][j] == 0 and elem[1][j] != 0) for j in range(3)]))
and not np.any([(j < 2 and elem[0][j] != 0 and elem[0][j] == elem[0][j+1] and elem[1][j+1] != 1) for j in range(3)])]
我有一个巨大的元组列表,每个元组包含另外两个元组,例如
lst = [((0,2,1), (2,1,3)), ((3,2,1), (0,1,1)), ...]
此列表中的许多元素在某些条件下是不可接受的,我正在尝试创建一个由满足这些条件的元素组成的新列表。其中,我想删除那些左(resp.right)元组包含零但右(resp.left)元组在相同位置没有零的元素。还有那些左元组包含两个连续的非零数字(在给定范围内)并且位于右元组中与重复出现的位置相同的数字不是 1 的元素。为此,我尝试过:
acceptable_lst = [elem for elem in lst for j in range(3) if not ((elem[0][j] == 0 and
elem[1][j] != 0) or (j < 2 and elem[0][j] != 0 and elem[0][j] == elem[0][j+1]
and elem[1][j+1] != 1)]
当我将此代码应用于例如
lst = [((3,2,2), (1,2,3)),
((0,1,3), (2,2,3)),
((1,1,2), (3,3,3)),
((0,2,2), (3,3,3)),
((2,2,1), (3,1,3))]
我想得到:
acceptable_lst = [((2,2,1), (3,1,3))]
为什么? lst
中的第一个元素在左元组中的代表为2,第二个2在第三个位置,但右元组中的第三个元素不是1。第二个元素在第一个位置为零左元组的和右元组相同位置的非零,依此类推......只有lst
中的最后一个元素满足上述条件。
然而我得到的是
[((3, 2, 2), (1, 2, 3)),
((3, 2, 2), (1, 2, 3)),
((0, 1, 3), (2, 2, 3)),
((0, 1, 3), (2, 2, 3)),
((1, 1, 2), (3, 3, 3)),
((1, 1, 2), (3, 3, 3)),
((0, 2, 2), (3, 3, 3)),
((2, 2, 1), (3, 1, 3)),
((2, 2, 1), (3, 1, 3)),
((2, 2, 1), (3, 1, 3))]
这表明我的代码完全错误。我怎样才能实现我需要的东西?
检查函数的有效性
def valid(elemLeft, elemRight):
lastItem = None
for i in range(3):
if elemLeft[i] == 0 and elemRight[i] != 0:
return False
if lastItem != None:
if elemLeft[i] == lastItem and elemRight[i] != 1:
return False
lastItem = elemLeft[i]
return True
lst = [((3,2,2),(1,2,3)), ((0,1,3),(2,2,3)), ((1,1,2),(3,3,3)), ((0,2,2),(3,3,3)), ((2,2,1),(3,1,3))]
acceptable_lst = [elem for elem in lst if valid(elem[0],elem[1])]
print(acceptable_lst)
您在列表理解中执行了两个 for 循环。
[ elem for elem in lst for j in range(3) if condition ]
相当于:
out_list = []
for elem in lst:
for j in range(3):
if condition:
out_list.append(elem)
如果您必须为此任务使用列表理解,您可以修改它:
import numpy as np
acceptable_lst = [elem for elem in lst
if not (np.any([(elem[0][j] == 0 and elem[1][j] != 0) for j in range(3)]))
and not np.any([(j < 2 and elem[0][j] != 0 and elem[0][j] == elem[0][j+1] and elem[1][j+1] != 1) for j in range(3)])]