大家好!基本上,我需要从列表中删除每个子列表,其中只包含任何项目中的一个 - 只要该项目本身不是一个。
这是一个例子:如果我有这个,
list = [(0, 0), (0, 1), (0, 2), (1, 1), (1, 0), (1, 3), (2, 0), (0, 3)]
我反过来想要这个:
list = [(0, 0), (1, 1)]
我最初的尝试是:
for sublist in list:
for item in sublist:
if sublist.count(item) == 1 and item != 1:
list.remove(sublist)
不幸的是,这干扰了原来for循环的循环(我认为),所以我最终会得到类似的结果:ValueError: list.remove(x): x not in list
任何帮助都会有所帮助。
答案 0 :(得分:3)
在运行for循环之前复制列表,因此在循环期间不会修改iterable
删除一个sublist
并中断,不要尝试将其删除两次。
虽然我在输出中只获得[(0, 0), (1, 1)]
但不是(1,3)
。
for sublist in list[:]:
for item in sublist:
if sublist.count(item) == 1 and item != 1:
list.remove(sublist)
break
答案 1 :(得分:0)
我不确定我是否理解任务,但在迭代它时更改列表绝不是一个好主意。 尝试先复制它,然后遍历副本。
类似的东西:
list_copy = list[:]
for sublist in list_copy:
for item in sublist:
if sublist.count(item) == 1 and item != 1:
list.remove(sublist)
请注意list_copy = list
将复制引用,这意味着更改一个列表也会更改另一个列表,因此您要编写list_copy = list[:]
P.S。
使用list
类型名称作为变量是一个非常糟糕的主意。尝试使用其他名称。
答案 2 :(得分:0)
我认为此代码适合您:
list = [(0, 0), (0, 1), (0, 2), (1, 1), (1, 0), (1, 3), (2, 0), (0, 3)]
out_list = [t for t in list if (t[0] == t[1]) or t.count(1) > 0]
此代码生成一个新列表,然后您可以将其重新分配给输入列表。 但上面的代码会在您的输入上生成:
[(0, 0), (0, 1), (1, 1), (1, 0), (1, 3)]
很抱歉,如果我理解你的任务不正确。
答案 3 :(得分:0)
您可能想要转到while循环:
List = [(0, 0), (0, 1), (0, 2), (1, 1), (1, 0), (1, 3), (2, 0), (0, 3)]
i = 0;
o = 0;
while i<len(List):
while o<len(List[i]):
if List[i].count(o) == 1 and List[i][o] != 1:
List.remove(List[i])
o+=1
i+=1
o=0;
print(List)
我得到了:
[(0,0),(0,2),(1,1),(1,3),(0,3)]
答案 4 :(得分:0)
您可以使用filter
功能过滤列表。首先,编写一个函数,它接受列表中的元素,如果元素应该在列表中,则返回True
,如果不是,则返回False
。像这样:
def predicate(x):
for item in x:
if x.count(item) == 1 and item != 1:
return False
return True
现在,您可以列出您的列表(请勿将其称为list
,因为list
是我们必须在一秒钟内使用的功能,并且通过调用您无法使用的内容列表说功能)
l = [(0, 0), (0, 1), (0, 2), (1, 1), (1, 0), (1, 3), (2, 0), (0, 3)]
使用谓词过滤它:
itr_res = filter(predicate,l)
但请注意,这会返回iterable
,而不是列表。您可能需要一个列表,因此请使用list
函数从iterable
构建一个列表。
res = list(itr_res)
这给出了结果列表:
[(0,0),(1,1)]
正如其他人所指出的那样,很难弄清楚你希望功能过滤的内容。你的代码做了一件事,你的例子和其他,你的描述是模糊的。你可以尝试使用谓词函数,直到你实现你想要的那样